当前位置:实例文章 » 其他实例» [文章]JUC常用4大并发工具类详解

JUC常用4大并发工具类详解

发布人:shili8 发布时间:2025-02-08 17:40 阅读次数:0

**JUC常用4大并发工具类详解**

Java.util.concurrent(JUC)包提供了一系列用于构建高性能、可伸缩的多线程应用程序的工具类。其中,四个最常用的工具类是:`Lock`、`Semaphore`、`CountDownLatch` 和 `CyclicBarrier`。本文将详细介绍这些工具类的使用方法和示例代码。

###1. Lock(锁)

`Lock` 接口提供了一个可重入的锁机制,允许线程在执行某个操作时暂停其它线程的访问。`ReentrantLock` 是 `Lock` 接口的一个实现类,它支持多种锁定策略。

####1.1 ReentrantLock(可重入锁)

`ReentrantLock` 支持多种锁定策略,包括公平锁和非公平锁。公平锁保证线程在等待锁的时间内不会被抢占,而非公平锁则允许线程在等待锁的时间内可能被抢占。

javaimport java.util.concurrent.locks.ReentrantLock;

public class ReentrantLockExample {
 private static final ReentrantLock lock = new ReentrantLock();

 public void doSomething() {
 // 加锁 lock.lock();
 try {
 System.out.println("正在执行...");
 Thread.sleep(1000);
 } catch (InterruptedException e) {
 Thread.currentThread().interrupt();
 } finally {
 //释放锁 lock.unlock();
 }
 }

 public static void main(String[] args) throws InterruptedException {
 ReentrantLockExample example = new ReentrantLockExample();
 Thread thread1 = new Thread(example::doSomething);
 Thread thread2 = new Thread(example::doSomething);

 thread1.start();
 thread2.start();

 thread1.join();
 thread2.join();
 }
}


####1.2 ReadWriteLock(读写锁)

`ReadWriteLock` 接口提供了一个可重入的读写锁机制,允许多个线程同时读取共享资源,而只允许一个线程修改共享资源。

javaimport java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class ReadWriteLockExample {
 private static final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();

 public void read() {
 // 加读锁 lock.readLock().lock();
 try {
 System.out.println("正在读取...");
 Thread.sleep(1000);
 } catch (InterruptedException e) {
 Thread.currentThread().interrupt();
 } finally {
 //释放读锁 lock.readLock().unlock();
 }
 }

 public void write() {
 // 加写锁 lock.writeLock().lock();
 try {
 System.out.println("正在修改...");
 Thread.sleep(1000);
 } catch (InterruptedException e) {
 Thread.currentThread().interrupt();
 } finally {
 //释放写锁 lock.writeLock().unlock();
 }
 }

 public static void main(String[] args) throws InterruptedException {
 ReadWriteLockExample example = new ReadWriteLockExample();

 Thread thread1 = new Thread(example::read);
 Thread thread2 = new Thread(example::write);

 thread1.start();
 thread2.start();

 thread1.join();
 thread2.join();
 }
}


###2. Semaphore(信号量)

`Semaphore` 类提供了一个可重入的信号量机制,允许多个线程等待某个资源的释放。

####2.1 SemaphoreExample
javaimport java.util.concurrent.Semaphore;

public class SemaphoreExample {
 private static final Semaphore semaphore = new Semaphore(3);

 public void doSomething() throws InterruptedException {
 // 等待信号量 semaphore.acquire();
 try {
 System.out.println("正在执行...");
 Thread.sleep(1000);
 } catch (InterruptedException e) {
 Thread.currentThread().interrupt();
 } finally {
 //释放信号量 semaphore.release();
 }
 }

 public static void main(String[] args) throws InterruptedException {
 SemaphoreExample example = new SemaphoreExample();

 for (int i =0; i < 10; i++) {
 Thread thread = new Thread(example::doSomething);
 thread.start();
 }

 Thread.sleep(10000);

 System.out.println("结束...");
 }
}


###3. CountDownLatch(倒计时门闩)

`CountDownLatch` 类提供了一个可重入的倒计时门闩机制,允许多个线程等待某个事件的发生。

####3.1 CountDownLatchExample
javaimport java.util.concurrent.CountDownLatch;

public class CountDownLatchExample {
 private static final int COUNT =5;
 private static final CountDownLatch latch = new CountDownLatch(COUNT);

 public void doSomething() throws InterruptedException {
 // 等待倒计时门闩 latch.await();
 System.out.println("事件发生...");
 }

 public static void main(String[] args) throws InterruptedException {
 CountDownLatchExample example = new CountDownLatchExample();

 for (int i =0; i < COUNT; i++) {
 Thread thread = new Thread(example::doSomething);
 thread.start();
 }

 // 等待所有线程执行完成 Thread.sleep(10000);

 System.out.println("结束...");
 }
}


###4. CyclicBarrier(循环栅栏)

`CyclicBarrier` 类提供了一个可重入的循环栅栏机制,允许多个线程等待某个事件的发生。

####4.1 CyclicBarrierExample
javaimport java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierExample {
 private static final int COUNT =5;
 private static final CyclicBarrier barrier = new CyclicBarrier(COUNT);

 public void doSomething() throws InterruptedException, BrokenBarrierException {
 // 等待循环栅栏 barrier.await();
 System.out.println("事件发生...");
 }

 public static void main(String[] args) throws InterruptedException, BrokenBarrierException {
 CyclicBarrierExample example = new CyclicBarrierExample();

 for (int i =0; i < COUNT; i++) {
 Thread thread = new Thread(example::doSomething);
 thread.start();
 }

 // 等待所有线程执行完成 Thread.sleep(10000);

 System.out.println("结束...");
 }
}


本文介绍了JUC包中四个最常用的工具类:`Lock`、`Semaphore`、`CountDownLatch` 和 `CyclicBarrier`。这些工具类可以帮助开发者构建高性能、可伸缩的多线程应用程序。

其他信息

其他资源

Top