2020久久超碰欧美精品最新亚洲欧美日韩久久精品,国产福利电影一区二区三区,亚洲欧美日韩一区在线观看,亚洲国产欧美日韩欧美特级,亚洲欧美日韩成人一区久久,欧美日韩精品一区二区三区不卡,国产欧美日韩va另类影音先锋,亚洲欧美日韩久久精品,亚洲欧美日韩国产成人精品影院,亚洲国产欧美日韩精品一区二区三区,欧美日韩国产成人高清视频,日韩久久精品国产免费观看频道,久久人人爽人人爽从片av高清,国产精品综合一区二区

首頁常見問題正文

Java中都有哪些同步器?

更新時間:2023-04-06 來源:黑馬程序員 瀏覽量:

IT培訓班

  Java中常用的同步器包括:

  1.synchronized關鍵字

  在Java中,使用synchronized關鍵字可以對代碼塊或方法進行同步,使得在同一時刻只有一個線程可以執行該代碼塊或方法。

  下面是一個使用synchronized關鍵字同步的示例代碼:

public class SynchronizedExample {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public synchronized int getCount() {
        return count;
    }
}

  2.ReentrantLock類

  ReentrantLock是一個可重入的互斥鎖,它可以和synchronized關鍵字一樣實現對臨界區的同步。使用ReentrantLock時需要手動獲取和釋放鎖。

  下面是一個使用ReentrantLock同步的示例代碼:

import java.util.concurrent.locks.ReentrantLock;

public class ReentrantLockExample {
    private int count = 0;
    private ReentrantLock lock = new ReentrantLock();

    public void increment() {
        lock.lock();
        try {
            count++;
        } finally {
            lock.unlock();
        }
    }

    public int getCount() {
        lock.lock();
        try {
            return count;
        } finally {
            lock.unlock();
        }
    }
}

  3.Semaphore類

  Semaphore是一個信號量,它可以限制同時訪問某一資源的線程數量。Semaphore可以用來實現生產者-消費者模型等。

  下面是一個使用Semaphore實現生產者-消費者模型的示例代碼:

import java.util.concurrent.Semaphore;

public class SemaphoreExample {
    private final Semaphore producerSemaphore = new Semaphore(1);
    private final Semaphore consumerSemaphore = new Semaphore(0);
    private int data;

    public void produce(int newData) throws InterruptedException {
        producerSemaphore.acquire();
        data = newData;
        consumerSemaphore.release();
    }

    public int consume() throws InterruptedException {
        consumerSemaphore.acquire();
        int consumedData = data;
        producerSemaphore.release();
        return consumedData;
    }
}

  4.Condition接口

  Condition是一個條件變量,它可以和Lock一起使用,可以實現更加靈活的線程同步。

  下面是一個使用Condition實現等待-通知模型的示例代碼:

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ConditionExample {
    private int data;
    private Lock lock = new ReentrantLock();
    private Condition notEmpty = lock.newCondition();
    private Condition notFull = lock.newCondition();
    private boolean full = false;

    public void put(int newData) throws InterruptedException {
        lock.lock();
        try {
            while (full) {
                notFull.await();
            }
            data = newData;
            full = true;
            notEmpty.signal();
        } finally {
            lock.unlock();
        }
    }

    public int take() throws InterruptedException {
        lock.lock();
        try {
            while (!full) {
                notEmpty.await();
            }
            int takenData = data;
            full = false;
            notFull.signal();
            return takenData;
        } finally {
            lock.unlock();
        }
    }
}

  5.CountDownLatch類

  CountDownLatch是一個同步工具類,它可以使一個或多個線程等待其他線程完成操作后再執行。CountDownLatch的使用需要指定計數器的初始值,并通過await()方法等待計數器歸零,同時通過countDown()方法將計數器減一。

  下面是一個使用CountDownLatch實現等待其他線程完成操作的示例代碼:

import java.util.concurrent.CountDownLatch;

public class CountDownLatchExample {
    public static void main(String[] args) throws InterruptedException {
        int count = 5;
        CountDownLatch latch = new CountDownLatch(count);
        for (int i = 0; i < count; i++) {
            Thread thread = new Thread(() -> {
                // 模擬線程操作
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("線程" + Thread.currentThread().getName() + "執行完成");
                // 計數器減一
                latch.countDown();
            });
            thread.start();
        }
        // 等待計數器歸零
        latch.await();
        System.out.println("所有線程執行完成");
    }
}

  6.CyclicBarrier類

  CyclicBarrier也是一個同步工具類,它可以使一組線程相互等待,直到所有線程都到達某個屏障點后再同時執行。CyclicBarrier的使用需要指定參與線程的數量,并通過await()方法等待所有線程到達屏障點,同時通過reset()方法將屏障重置,可以用于多次使用。

  下面是一個使用CyclicBarrier實現線程同步的示例代碼:

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierExample {
    public static void main(String[] args) {
        int count = 3;
        CyclicBarrier barrier = new CyclicBarrier(count, () -> {
            System.out.println("所有線程執行完成");
        });
        for (int i = 0; i < count; i++) {
            Thread thread = new Thread(() -> {
                // 模擬線程操作
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("線程" + Thread.currentThread().getName() + "執行完成");
                try {
                    // 等待其他線程
                    barrier.await();
                } catch (InterruptedException | BrokenBarrierException e) {
                    e.printStackTrace();
                }
            });
            thread.start();
        }
    }
}

  以上是Java中常用的同步器,不同的同步器有著不同的適用場景和使用方式,需要根據實際情況選擇合適的同步器進行使用。

分享到:
在線咨詢 我要報名
和我們在線交談!