java线程间通信方式
- synchronized
- ReentrantLock
- CountDownLatch:某个线程等待其他线程
- CyclicBarrier:一组线程互相等待
- Exchanger:一对线程交换数据
- Semaphore:信号量
- LockSupport#park && LockSupport#unpark
- Object#wait && Object#notify
- Condition#await && Condition#notify
- Thread#join
- 参考
本文重在实战,不讲原理。
synchronized
- java语言层面的同步,性能在1.6之后很ok了。
- static方法,非static方法,代码块。
- 可重入
ReentrantLock
- 可重入
- 公平锁&非公平锁
- lock、tryLock、lockInterruptibly、newCondition
- ReentranctLock
CountDownLatch:某个线程等待其他线程
- 某个线程等待其他线程执行完任务后,它才执行。
- 不可重用
- await无限等待或等待超时,直到count为0.
eg. 多线程获取所有待执行task,获取完成之后执行之。具体见代购proxy MessageReadTask
CyclicBarrier:一组线程互相等待
- 一组线程
互相
等待至某个状态,然后执行对应的barrierCommand - 可重用(回环栅栏),barrierCommand执行完成之后,会进入nextGeneration,count会被重置成parities
eg. CountDownLatch的例子同样适用。
Exchanger:一对线程交换数据
- exchange方法帮一对线程交换数据
- exchange方法会阻塞调用方线程直至另一方线程参与交换
Semaphore:信号量
- 通过计数器控制对共享资源的访问
LockSupport#park && LockSupport#unpark
- LockSupport#park()针对thread进行阻塞处理,可以指定阻塞队列的目标对象
- LockSupport#unpark()可以指定具体的线程唤醒。
- 实现机制和object.wait()不同,两者的阻塞队列并不交叉。
Object#wait && Object#notify
- obj#wait当前线程释放对obj的锁,直到别的线程调用该obj#notify或者notifyAll才可能被唤醒。
Condition#await && Condition#notify
- 与object#wait和notify不同的是Condition可以有多个谓词条件。
Thread#join
- threadx.join(): 当前线程等待threadx执行完成
- threadx.join(1000): 当前线程等待threadx执行完成或超时,超时的话,不会影响threadx的执行。
参考
java并发-ReentrantLock的lock和lockInterruptibly的区别
- 上一篇 jvm内存模型
- 下一篇 java并发编程实战笔记与实践