wait和notify方法实现多线程的等待和通知

在Java程序中,synchronized解决了多线程竞争的问题。例如,对于一个任务管理器,多个线程同时往队列中添加任务,可以用synchronized加锁: class TaskQueue { Queue<String> queue = new LinkedList<>(); public synchronized void addTask(String s) { thi
wait和notify方法实现多线程的等待和通知

可重入锁ReentrantLock详解

从Java 5开始,引入了一个高级的处理并发的java.util.concurrent包,它提供了大量更高级的并发功能,能大大简化多线程程序的编写。 我们知道Java语言直接提供了synchronized关键字用于加锁,但这种锁一是很重,二是获取时必须一直等待,没有额外的尝试机制。 java.util.concurrent.locks包提供的ReentrantLock用于替代synchronize
可重入锁ReentrantLock详解

Condition接口实现线程的等待和通知

使用ReentrantLock比直接使用synchronized更安全,可以替代synchronized进行线程同步。 但是,synchronized可以配合wait和notify实现线程在条件不满足时等待,条件满足时唤醒,用ReentrantLock我们怎么编写wait和notify的功能呢? 答案是使用Condition对象来实现wait和notify的功能。 我们仍然以TaskQueue为例
Condition接口实现线程的等待和通知

ReadWriteLock使用详解

前面讲到的ReentrantLock保证了只有一个线程可以执行临界区代码: public class Counter { private final Lock lock = new ReentrantLock(); private int counts = new int; public void inc(int index) { lock.lock(); try { counts
ReadWriteLock使用详解

乐观锁StampedLock实现同时读写操作

前面介绍的ReadWriteLock可以解决多线程同时读,但只有一个线程能写的问题。 如果我们深入分析ReadWriteLock,会发现它有个潜在的问题:如果有线程正在读,写线程需要等待读线程释放锁后才能获取写锁,即读的过程中不允许写,这是一种悲观的读锁。 要进一步提升并发执行效率,Java 8引入了新的读写锁:StampedLock。 StampedLock和ReadWriteLock相比,改进
乐观锁StampedLock实现同时读写操作

信号计数器Semaphore访问受限资源

前面我们讲了各种锁的实现,本质上锁的目的是保护一种受限资源,保证同一时刻只有一个线程能访问(ReentrantLock),或者只有一个线程能写入(ReadWriteLock)。 还有一种受限资源,它需要保证同一时刻最多有N个线程能访问,比如同一时刻最多创建100个数据库连接,最多允许10个用户下载等。 这种限制数量的锁,如果用Lock数组来实现,就太麻烦了。 这种情况就可以使用Semaphore,
信号计数器Semaphore访问受限资源

并发工具Concurrent详解

我们在前面已经通过ReentrantLock和Condition实现了一个BlockingQueue: public class TaskQueue { private final Lock lock = new ReentrantLock(); private final Condition condition = lock.newCondition(); private Queue<St
并发工具Concurrent详解

Atomic原子操作实现线程安全

Java的java.util.concurrent包除了提供底层锁、并发集合外,还提供了一组原子操作的封装类,它们位于java.util.concurrent.atomic包。 我们以AtomicInteger为例,它提供的主要操作有: 增加值并返回新值:int addAndGet(int delta) 加1后返回新值:int incrementAndGet() 获取当前值:int get() 用
Atomic原子操作实现线程安全