Heim Java javaLernprogramm Beispielanalyse zweier Java-Threads, die einer Variablen 1 hinzufügen

Beispielanalyse zweier Java-Threads, die einer Variablen 1 hinzufügen

Apr 28, 2023 pm 09:52 PM
java

1 – Falsche konventionelle Schreibweise

<code>public static int i=0;</code><code>public static void add(){</code><code>    i=i+1;</code><code>    action();</code><code>}</code><code>public static void action(){</code><code>    System.out.println("==&gt;"+Thread.currentThread().getName()+":"+i);</code><code>}</code><code>public static void main(String[] args) throws InterruptedException {</code><code>    Thread t1 = new Thread(SysUserServiceImpl::add,"t1");</code><code>    Thread t2= new Thread(SysUserServiceImpl::add,"t2");</code><code>    t1.start();</code><code>    t2.start();</code><code>}</code><code>运行结果==&gt;</code><code>==&gt;t1:1</code><code>==&gt;t2:2</code><code><br></code><code>==&gt;t1:2</code><code>==&gt;t2:1</code><code><br></code><code>==&gt;t1:2</code><code>==&gt;t2:2</code>
Nach dem Login kopieren

Die Ergebnisse sind jedes Mal inkonsistent. In einer Multithread-Umgebung führt t1 eine +1-Operation für i im gemeinsam genutzten Speicher aus, aktualisiert jedoch nicht den Wert im Hauptspeicher. Zu diesem Zeitpunkt führt t2 zufällig auch eine aus +1-Operation, ob i 0 ist oder nicht, sodass das Endergebnis i alle 1 ist. Auf die gleiche Weise ist t1 nach der Verarbeitung 1 und t2 nach der Verarbeitung 2. Die Ergebnisse mehrerer Durchläufe sind inkonsistent.

Verbesserungsmethode 1 – Synchronisationssperre

<code>public class ThreadException {</code><code>    public static volatile int i=0;</code><code>    public static void add(){</code><code>        synchronized (ThreadException.class){</code><code>            i=i+1;</code><code>            action();</code><code>        }</code><code>    }</code><code>    public static void action(){</code><code>        System.out.println("==&gt;"+Thread.currentThread().getName()+":"+i);</code><code>    }</code><code>    public static void main(String[] args) throws InterruptedException {</code><code>        Thread t1 = new Thread(ThreadException::add,"t1");</code><code>        Thread t2= new Thread(ThreadException::add,"t2");</code><code>        t1.start();</code><code>        t2.start();</code><code><br></code><code>    }</code><code>}</code>
Nach dem Login kopieren

Vorteile: einfache Implementierung

Nachteile: große Sperrgranularität, geringe Leistung, verteilte Umgebung, mehrere JVM-Bedingungen, synchronisierter Fehler, synchronisiert ist nur eine lokale Sperre und in einem verteilten Szenario werden nur Objekte unter der aktuellen JVM gesperrt. Verwenden Sie eine verteilte Sperre

Verbesserte Methode 2 AtomicInteger

public class ThreadException {    private static AtomicInteger num = new AtomicInteger(0);    public static void add(){        int i = num.getAndIncrement();        action(i);    }    public static void action(int i){        System.out.println("由"+i+"==&gt;"+Thread.currentThread().getName()+":"+num);    }    public static void main(String[] args) throws InterruptedException {        Thread t1 = new Thread(ThreadException::add,"t1");        Thread t2= new Thread(ThreadException::add,"t2");        t1.start();        t2.start();    }}
Nach dem Login kopieren

Verbesserungsmethode 3 Schloss

<code>public class ThreadException {</code><code>    public static volatile int i=0;</code><code>    public static void action(){</code><code>        System.out.println("==&gt;"+Thread.currentThread().getName()+":"+i);</code><code>    }</code><code><br></code><code>    static Lock lock=new ReentrantLock();</code><code>    public static void inc() {</code><code>        lock.lock();</code><code>        try {</code><code>            Thread.sleep(1);</code><code>            i=i+1;</code><code>            action();</code><code>        } catch (InterruptedException e) {</code><code>            e.printStackTrace();</code><code>        } finally {</code><code>            lock.unlock();</code><code>        }</code><code>    }</code><code>    public static void main(String[] args) throws InterruptedException {</code><code>        Thread t1 = new Thread(ThreadException::inc,"t1");</code><code>        Thread t2= new Thread(ThreadException::inc,"t2");</code><code>        t1.start();</code><code>        t2.start();</code><code>    }</code><code>}</code><code><br></code>
Nach dem Login kopieren

Verteilte Sperre: Stellen Sie die gleichzeitige Ausführung mehrerer Knoten sicher
Implementierungsplan: 1. Basierend auf der Datenbank, 2. Basierend auf dem Redis-Cache, 3. Basierend auf zookeeper

Das obige ist der detaillierte Inhalt vonBeispielanalyse zweier Java-Threads, die einer Variablen 1 hinzufügen. 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 Artikel -Tags

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

Quadratwurzel in Java

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

Perfekte Zahl in Java

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

Zufallszahlengenerator in Java

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

Armstrong-Zahl in Java

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

Weka in Java

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

Smith-Nummer in Java

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

Fragen zum Java Spring-Interview

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

Brechen oder aus Java 8 Stream foreach zurückkehren?

See all articles