Heim  >  Artikel  >  Java  >  Wie verwende ich Sperren und Synchronisierer in der gleichzeitigen Java-Programmierung?

Wie verwende ich Sperren und Synchronisierer in der gleichzeitigen Java-Programmierung?

PHPz
PHPzOriginal
2024-05-08 22:06:02872Durchsuche

Java bietet Sperren und Synchronisierer, um den Zugriff auf gemeinsam genutzte Ressourcen zu verwalten. Sperren wie ReentrantLock ermöglichen jeweils nur einem Thread den Zugriff auf einen kritischen Abschnitt, während Synchronisierer wie Semaphore und CountDownLatch eine flexiblere Parallelitätskontrolle bieten, z. B. die Begrenzung der Anzahl der Threads, die gleichzeitig auf eine Ressource zugreifen, oder das Warten darauf, dass alle Threads ihre Aufgaben abgeschlossen haben . Durch die Verwendung dieser Mechanismen können Datenwettläufe wirksam vermieden und die Anwendungsleistung verbessert werden.

Java 并发编程中如何使用锁和同步器?

Sperren und Synchronisierer in der gleichzeitigen Java-Programmierung

Die gleichzeitige Programmierung ermöglicht die gleichzeitige Ausführung mehrerer Threads, erfordert jedoch Mechanismen zur Verwaltung des Zugriffs auf gemeinsam genutzte Ressourcen. Um dies zu erreichen, stellt Java verschiedene Sperren und Synchronisierer bereit.

Sperren

Sperren ermöglichen jeweils nur einem Thread den Zugriff auf den kritischen Abschnitt (geänderter Teil einer gemeinsam genutzten Ressource). Häufig verwendete Sperren sind:

// 创建一个 ReentrantLock
Lock lock = new ReentrantLock();

// 获取锁
lock.lock();

// 访问临界区
// ...

// 释放锁
lock.unlock();

Synchronizer

Synchronizer sind fortschrittlicher als Sperren und bieten eine flexiblere Parallelitätskontrolle. Häufig verwendete Synchronisierer sind:

Semaphore

Semaphore begrenzt die Anzahl der Threads, die gleichzeitig auf Ressourcen zugreifen können.

// 创建一个 Semaphore,允许最多 3 个线程同时访问
Semaphore semaphore = new Semaphore(3);

// 申请许可证
semaphore.acquire();

// 访问临界区
// ...

// 释放许可证
semaphore.release();

CountDownLatch

CountDownLatch wartet, bis alle Threads ihre Aufgaben abgeschlossen haben, bevor es fortfährt.

// 创建一个 CountDownLatch,等待 10 个线程完成
CountDownLatch latch = new CountDownLatch(10);

// 10 个线程执行任务
// ...

// 每个线程完成后,计数器减一
latch.countDown();

// 主线程等待所有线程完成
latch.await();

Praktischer Fall

Das Folgende ist ein praktischer Fall des Bankkontobetriebs, bei dem Semaphore verwendet wird, um die Anzahl der Threads zu begrenzen, die gleichzeitig auf das Konto zugreifen:

class BankAccount {
    private Semaphore semaphore = new Semaphore(1);
    private double balance;

    public void deposit(double amount) {
        try {
            semaphore.acquire();
            balance += amount;
        } finally {
            semaphore.release();
        }
    }

    public void withdraw(double amount) {
        try {
            semaphore.acquire();
            balance -= amount;
        } finally {
            semaphore.release();
        }
    }
}

Fazit

Sperren und Synchronisierer werden verwendet Verwalten Sie den Zugriff auf gemeinsam genutzte Ressourcen in einem leistungsstarken Java-Tool für die gleichzeitige Programmierung. Durch den sorgfältigen Einsatz dieser Mechanismen können Sie Datenwettläufe effektiv vermeiden und die Programmleistung verbessern.

Das obige ist der detaillierte Inhalt vonWie verwende ich Sperren und Synchronisierer in der gleichzeitigen Java-Programmierung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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