java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java aqs

Java 中 AQS 的几大经典实现示例详解

作者:Techie峰

AQS是Java并发包中的一个核心基础类,用于构建高效、可扩展的锁和同步器,以下是Java中常见的基于AQS的实现类,每个实现都针对特定场景提供了同步功能,我会逐一介绍它们的主要用途、特点,并提供一个简单的代码示例,感兴趣的朋友一起看看吧

AbstractQueuedSynchronizer(AQS)是Java并发包(java.util.concurrent.locks)中的一个核心基础类,用于构建高效、可扩展的锁和同步器。它通过一个FIFO队列管理线程的排队和唤醒机制,简化了同步器的开发。以下是Java中常见的基于AQS的实现类,每个实现都针对特定场景提供了同步功能。我会逐一介绍它们的主要用途、特点,并提供一个简单的代码示例。

1.ReentrantLock(可重入锁)

import java.util.concurrent.locks.ReentrantLock;
public class ReentrantLockExample {
    private final ReentrantLock lock = new ReentrantLock();
    public void safeMethod() {
        lock.lock(); // 获取锁
        try {
            // 临界区代码
            System.out.println("线程安全操作");
        } finally {
            lock.unlock(); // 释放锁
        }
    }
}

2.ReentrantReadWriteLock(可重入读写锁)

import java.util.concurrent.locks.ReentrantReadWriteLock;
public class ReadWriteLockExample {
    private final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
    private int sharedData = 0;
    public void readData() {
        rwLock.readLock().lock(); // 获取读锁
        try {
            System.out.println("读取数据: " + sharedData);
        } finally {
            rwLock.readLock().unlock(); // 释放读锁
        }
    }
    public void writeData(int value) {
        rwLock.writeLock().lock(); // 获取写锁
        try {
            sharedData = value;
            System.out.println("写入数据: " + value);
        } finally {
            rwLock.writeLock().unlock(); // 释放写锁
        }
    }
}

3.Semaphore(信号量)

代码示例

import java.util.concurrent.Semaphore;
public class SemaphoreExample {
    private final Semaphore semaphore = new Semaphore(3); // 允许最多3个线程同时访问
    public void accessResource() throws InterruptedException {
        semaphore.acquire(); // 获取许可证
        try {
            // 访问共享资源
            System.out.println("资源被占用中...");
            Thread.sleep(1000); // 模拟操作
        } finally {
            semaphore.release(); // 释放许可证
        }
    }
}

4.CountDownLatch(倒计时门闩)

代码示例

import java.util.concurrent.CountDownLatch;
public class CountDownLatchExample {
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch latch = new CountDownLatch(3); // 初始化计数器为3
        for (int i = 0; i < 3; i++) {
            new Thread(() -> {
                System.out.println("子线程完成任务");
                latch.countDown(); // 计数器减1
            }).start();
        }
        latch.await(); // 主线程等待计数器归零
        System.out.println("所有任务完成,主线程继续");
    }
}

5.CyclicBarrier(循环屏障)

代码示例

import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierExample {
    public static void main(String[] args) {
        CyclicBarrier barrier = new CyclicBarrier(3, () -> 
            System.out.println("所有线程到达屏障,执行后续任务"));
        for (int i = 0; i < 3; i++) {
            new Thread(() -> {
                try {
                    System.out.println("线程到达屏障");
                    barrier.await(); // 等待其他线程
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
}

总结

以上是Java中常见的基于AQS的实现类,它们覆盖了互斥锁、读写锁、资源控制、线程协调等多种并发场景。使用这些类时,注意线程安全和资源管理,避免死锁。AQS的设计模式(如状态变量和队列管理)确保了这些实现的高效性和可扩展性。在实际开发中,根据需求选择合适的同步器,并参考官方文档(如java.util.concurrent包)获取更多细节。

到此这篇关于Java 中 AQS 的几大经典实现的文章就介绍到这了,更多相关java aqs内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文