Inhaltsverzeichnis
Einführung
Einführung in das Atomic-Paket
Atomic Update Basic Type Class
Dessert
Atomic Update Array Class
Atomic Update Reference Type
Atom-Update-Feldklasse
Heim Java javaLernprogramm Detaillierte Einführung in die Codefreigabe, die vom Atomic-Paket in Java verwendet wird

Detaillierte Einführung in die Codefreigabe, die vom Atomic-Paket in Java verwendet wird

Mar 23, 2017 am 10:58 AM

Einführung

Java stellt seit JDK1.5 das Paket java.util.concurrent.atomic bereit, um Programmierern die Durchführung sperrenfreier atomarer Operationen in einer Multithread-Umgebung zu erleichtern. Die unterste Schicht der atomaren -Variable verwendet die vom Prozessor bereitgestellten atomaren Anweisungen, aber unterschiedliche CPU--Architekturen können unterschiedliche atomare Anweisungen bereitstellen und möglicherweise auch eine Art interne Sperre erfordern, daher ist dies der Fall Die Methode kann nicht absolut garantieren, dass der Thread nicht blockiert wird.

Einführung in das Atomic-Paket

Das Atomic-Paket enthält 12 Klassen und vier Atomic-Update-Methoden, nämlich den Atomic-Update-Basistyp, das Atomic-Update-Array, die Atomic-Update-Referenz und das Atomic-Update-Feld. Die Klassen im Atomic-Paket sind grundsätzlich Wrapper-Klassen, die mit Unsafe implementiert werden.

Atomic Update Basic Type Class

wird verwendet, um Basistypen atomar zu aktualisieren. Das Atomic-Paket stellt die folgenden drei Klassen bereit:

  • AtomicBoolean: Atomic Update Boolescher Typ.

  • AtomicInteger: Atomare Update-Ganzzahl.

  • AtomicLong: Atomic-Update lang.

Die gängigen Methoden von AtomicInteger sind wie folgt:

  • int addAndGet(int delta): Kombiniere den Eingabewert atomar mit dem Wert im Instanz (Wert in AtomicInteger) wird hinzugefügt und das Ergebnis wird zurückgegeben

  • boolean CompareAndSet(int Expect, Int Update): Wenn der Eingabewert gleich dem erwarteten Wert ist, ist der Wert atomar auf den eingegebenen Wert gesetzt.

  • int getAndIncrement(): Addiere atomar 1 zum aktuellen Wert. Hinweis: Der hier zurückgegebene Wert ist der Wert vor dem Inkrement.

  • void lazySet(int newValue): Es wird schließlich auf newValue gesetzt. Nach der Verwendung von lazySet zum Festlegen des Werts können andere Threads möglicherweise in kurzer Zeit noch den alten Wert lesen der Zeit.

  • int getAndSet(int newValue): Setzt den Wert atomar auf newValue und gibt den alten Wert zurück.

AtomicInteger-Beispielcode lautet wie folgt:

import java.util.concurrent.atomic.AtomicInteger;

public class AtomicIntegerTest {

	static AtomicInteger ai = new AtomicInteger(1);

	public static void main(String[] args) {
		System.out.println(ai.getAndIncrement());
		System.out.println(ai.get());
	}

}
Nach dem Login kopieren

Ausgabe

1
2
Nach dem Login kopieren

Dessert

Das Atomic-Paket bietet drei Atomare Aktualisierungen von Grundtypen, aber zu den Grundtypen von Java gehören char, float, double usw. Die Frage ist also: Wie kann man andere Grundtypen atomar aktualisieren? Die Klassen im Atomic-Paket werden grundsätzlich mit Unsafe implementiert. Schauen wir uns den Quellcode von Unsafe an und stellen fest, dass Unsafe nur drei CAS-Methoden bereitstellt: CompareAndSwapObject, CompareAndSwapInt und CompareAndSwapLong Konvertiert einen Booleschen Wert in eine Ganzzahl und führt dann mit CompareAndSwapInt CAS aus, sodass eine atomare Aktualisierung von Double auch mit einer ähnlichen Idee implementiert werden kann.

Atomic Update Array Class

Aktualisieren Sie ein Element im Array atomar. Das Atomic-Paket stellt die folgenden drei Klassen bereit:

  • AtomicIntegerArray: Elemente atomar aktualisieren in einem Integer-Array.

  • AtomicLongArray: Atomare Aktualisierung von Elementen in einem Long-Integer-Array.

  • AtomicReferenceArray: Atomare Aktualisierung von Elementen in einem Referenztyp-Array.

Die AtomicIntegerArray-Klasse bietet hauptsächlich eine atomare Möglichkeit, die Ganzzahl im Array zu aktualisieren. Ihre allgemeinen Methoden sind wie folgt:

  • int addAndGet(int i, int delta): Fügt den Eingabewert atomar zum Element am Index i im Array hinzu.

  • boolean CompareAndSet(int i, int Expect, Int Update): Wenn der aktuelle Wert gleich dem erwarteten Wert ist, setzen Sie das Element an der Array-Position i atomar auf den Aktualisierungswert.

Der Beispielcode lautet wie folgt:

public class AtomicIntegerArrayTest {

	static int[] value = new int[] { 1, 2 };

	static AtomicIntegerArray ai = new AtomicIntegerArray(value);

	public static void main(String[] args) {
		ai.getAndSet(0, 3);
		System.out.println(ai.get(0));
                System.out.println(value[0]);
	}

}
Nach dem Login kopieren

Ausgabe

3
1
Nach dem Login kopieren

AtomicIntegerArray-Klasse Es ist zu beachten, dass der Array-Wert übergeben wird über den -Konstruktor Übergeben Sie es, und dann erstellt AtomicIntegerArray eine Kopie des aktuellen Arrays. Wenn AtomicIntegerArray also die internen Array-Elemente ändert, hat dies keine Auswirkungen auf das eingehende Array.

Atomic Update Reference Type

Atomic Update des Basistyps AtomicInteger kann nur eine Variable aktualisieren. Wenn Sie mehrere Variablen atomar aktualisieren möchten, müssen Sie die von dieser atomaren Update-Referenz bereitgestellte Klasse verwenden Typ. Das Atomic-Paket stellt die folgenden drei Klassen bereit:

  • AtomicReference: Atomic-Update-Referenztyp.

  • AtomicReferenceFieldUpdater: Aktualisiert Felder in Referenztypen atomar.

  • AtomicMarkableReference: Atomare Aktualisierung eines Referenztyps mit einem Markierungsbit. Es ist möglich, ein boolesches Flagbit und einen Referenztyp atomar zu aktualisieren. Die Konstruktionsmethode ist AtomicMarkableReference(V initialRef, boolean initialMark)

Der Beispielcode für die Verwendung von AtomicReference lautet wie folgt:

public class AtomicReferenceTest {

	public static AtomicReference<user> atomicUserRef = new AtomicReference</user><user>();

	public static void main(String[] args) {
		User user = new User("conan", 15);
		atomicUserRef.set(user);
		User updateUser = new User("Shinichi", 17);
		atomicUserRef.compareAndSet(user, updateUser);
		System.out.println(atomicUserRef.get().getName());
		System.out.println(atomicUserRef.get().getOld());
	}

	static class User {
		private String name;
		private int old;

		public User(String name, int old) {
			this.name = name;
			this.old = old;
		}

		public String getName() {
			return name;
		}

		public int getOld() {
			return old;
		}
	}
}
Nach dem Login kopieren

Ausgabe

Shinichi
17
Nach dem Login kopieren

Atom-Update-Feldklasse

Wenn wir nur ein bestimmtes Feld in einer bestimmten Klasse benötigen, müssen wir die Atomic-Update-Feldklasse verwenden. Das Atomic-Paket stellt die folgenden drei Klassen bereit:

  • AtomicIntegerFieldUpdater: Updater zum atomaren Aktualisieren von Ganzzahlfeldern.

  • AtomicLongFieldUpdater: Updater für die atomare Aktualisierung langer Ganzzahlfelder.

  • AtomicStampedReference:原子更新带有版本号的引用类型。该类将整数值与引用关联起来,可用于原子的更数据和数据的版本号,可以解决使用CAS进行原子更新时,可能出现的ABA问题。

原子更新字段类都是抽象类,每次使用都时候必须使用静态方法newUpdater创建一个更新器。原子更新类的字段的必须使用public Volatile修饰符。AtomicIntegerFieldUpdater的例子代码如下:

public class AtomicIntegerFieldUpdaterTest {

	private static AtomicIntegerFieldUpdater<User> a = AtomicIntegerFieldUpdater
			.newUpdater(User.class, "old");

	public static void main(String[] args) {
		User conan = new User("conan", 10);
		System.out.println(a.getAndIncrement(conan));
		System.out.println(a.get(conan));
	}

	public static class User {
		private String name;
		public volatile int old;

		public User(String name, int old) {
			this.name = name;
			this.old = old;
		}

		public String getName() {
			return name;
		}

		public int getOld() {
			return old;
		}
	}
}
Nach dem Login kopieren

输出

10
11
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in die Codefreigabe, die vom Atomic-Paket in Java verwendet wird. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Quadratwurzel in Java Quadratwurzel in Java Aug 30, 2024 pm 04:26 PM

Leitfaden zur Quadratwurzel in Java. Hier diskutieren wir anhand eines Beispiels und seiner Code-Implementierung, wie Quadratwurzel in Java funktioniert.

Perfekte Zahl in Java Perfekte Zahl in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

Zufallszahlengenerator in Java Zufallszahlengenerator in Java Aug 30, 2024 pm 04:27 PM

Leitfaden zum Zufallszahlengenerator in Java. Hier besprechen wir Funktionen in Java anhand von Beispielen und zwei verschiedene Generatoren anhand ihrer Beispiele.

Weka in Java Weka in Java Aug 30, 2024 pm 04:28 PM

Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

Armstrong-Zahl in Java Armstrong-Zahl in Java Aug 30, 2024 pm 04:26 PM

Leitfaden zur Armstrong-Zahl in Java. Hier besprechen wir eine Einführung in die Armstrong-Zahl in Java zusammen mit einem Teil des Codes.

Smith-Nummer in Java Smith-Nummer in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

Fragen zum Java Spring-Interview Fragen zum Java Spring-Interview Aug 30, 2024 pm 04:29 PM

In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

See all articles