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

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

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)

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

PHP: Eine Schlüsselsprache für die Webentwicklung PHP: Eine Schlüsselsprache für die Webentwicklung Apr 13, 2025 am 12:08 AM

PHP ist eine Skriptsprache, die auf der Serverseite weit verbreitet ist und insbesondere für die Webentwicklung geeignet ist. 1.PHP kann HTML einbetten, HTTP -Anforderungen und Antworten verarbeiten und eine Vielzahl von Datenbanken unterstützt. 2.PHP wird verwendet, um dynamische Webinhalte, Prozessformdaten, Zugriffsdatenbanken usw. mit starker Community -Unterstützung und Open -Source -Ressourcen zu generieren. 3. PHP ist eine interpretierte Sprache, und der Ausführungsprozess umfasst lexikalische Analyse, grammatikalische Analyse, Zusammenstellung und Ausführung. 4.PHP kann mit MySQL für erweiterte Anwendungen wie Benutzerregistrierungssysteme kombiniert werden. 5. Beim Debuggen von PHP können Sie Funktionen wie error_reporting () und var_dump () verwenden. 6. Optimieren Sie den PHP-Code, um Caching-Mechanismen zu verwenden, Datenbankabfragen zu optimieren und integrierte Funktionen zu verwenden. 7

Zeitstempel für Datum in Java Zeitstempel für Datum in Java Aug 30, 2024 pm 04:28 PM

Anleitung zum TimeStamp to Date in Java. Hier diskutieren wir auch die Einführung und wie man Zeitstempel in Java in ein Datum konvertiert, zusammen mit Beispielen.

Java -Programm, um das Kapselvolumen zu finden Java -Programm, um das Kapselvolumen zu finden Feb 07, 2025 am 11:37 AM

Kapseln sind dreidimensionale geometrische Figuren, die aus einem Zylinder und einer Hemisphäre an beiden Enden bestehen. Das Volumen der Kapsel kann berechnet werden, indem das Volumen des Zylinders und das Volumen der Hemisphäre an beiden Enden hinzugefügt werden. In diesem Tutorial wird erörtert, wie das Volumen einer bestimmten Kapsel in Java mit verschiedenen Methoden berechnet wird. Kapselvolumenformel Die Formel für das Kapselvolumen lautet wie folgt: Kapselvolumen = zylindrisches Volumenvolumen Zwei Hemisphäre Volumen In, R: Der Radius der Hemisphäre. H: Die Höhe des Zylinders (ohne die Hemisphäre). Beispiel 1 eingeben Radius = 5 Einheiten Höhe = 10 Einheiten Ausgabe Volumen = 1570,8 Kubikeinheiten erklären Berechnen Sie das Volumen mithilfe der Formel: Volumen = π × R2 × H (4

PHP vs. Python: Verständnis der Unterschiede PHP vs. Python: Verständnis der Unterschiede Apr 11, 2025 am 12:15 AM

PHP und Python haben jeweils ihre eigenen Vorteile, und die Wahl sollte auf Projektanforderungen beruhen. 1.PHP eignet sich für die Webentwicklung mit einfacher Syntax und hoher Ausführungseffizienz. 2. Python eignet sich für Datenwissenschaft und maschinelles Lernen mit präziser Syntax und reichhaltigen Bibliotheken.

Gestalten Sie die Zukunft: Java-Programmierung für absolute Anfänger Gestalten Sie die Zukunft: Java-Programmierung für absolute Anfänger Oct 13, 2024 pm 01:32 PM

Java ist eine beliebte Programmiersprache, die sowohl von Anfängern als auch von erfahrenen Entwicklern erlernt werden kann. Dieses Tutorial beginnt mit grundlegenden Konzepten und geht dann weiter zu fortgeschrittenen Themen. Nach der Installation des Java Development Kit können Sie das Programmieren üben, indem Sie ein einfaches „Hello, World!“-Programm erstellen. Nachdem Sie den Code verstanden haben, verwenden Sie die Eingabeaufforderung, um das Programm zu kompilieren und auszuführen. Auf der Konsole wird „Hello, World!“ ausgegeben. Mit dem Erlernen von Java beginnt Ihre Programmierreise, und wenn Sie Ihre Kenntnisse vertiefen, können Sie komplexere Anwendungen erstellen.

Wie führe ich Ihre erste Spring -Boot -Anwendung in der Spring Tool Suite aus? Wie führe ich Ihre erste Spring -Boot -Anwendung in der Spring Tool Suite aus? Feb 07, 2025 pm 12:11 PM

Spring Boot vereinfacht die Schaffung robuster, skalierbarer und produktionsbereiteter Java-Anwendungen, wodurch die Java-Entwicklung revolutioniert wird. Der Ansatz "Übereinkommen über Konfiguration", der dem Feder -Ökosystem inhärent ist, minimiert das manuelle Setup, Allo

See all articles