Java 多线程 --- 线程同步与线程协作的区别
背景: 操作系统 — 线程/进程 同步
线程同步
- 线程同步解决的是race condition问题, 也就是保证了线程安全, 让多个线程可以并发访问共享资源
Java中的线程同步机制包括
- ReentrantLock (使用锁)
- synchronized关键字 (使用锁)
- volatile关键字
- Java 原子变量类 (Atomics):
java.util.concurrent.atomic
- 线程安全的集合:
ConcurrentHashMap<K,V> , ConcurrentLinkedDeque<E>, ConcurrentLinkedQueue<E>
等
使用提示:
- 遇到线程同步的问题时, 首先使用
java.util.concurrent pakcage
, (不包括java.util.concurrent.locks
) 主要指atomics类
和ConcurrentHashMap, ConcurrentLinkedDeque, ConcurrentLinkedQueue
. 这些都是封装好的线程安全的库- 如果不能满足需求, 则选择使用
synchronized, volatile
.- 实在不行再用
java.util.concurrent.locks
包括ReentrantLock
线程协作
- 线程协作是指多个线程分工合作, 共同完成任务.
- 比如线程的互相唤起, 阻塞, 中断等都是线程协作
Java中的线程协作机制包括
- 等待与通知
: Object.wait/notify
- Condition变量:
java.util.concurrent.locks.Condition
- 倒计时协调器(CountDownLatch):
java.util.concurrent.locks.CountDownLatch
- 栅栏:(CycliBarrier):
java.util.concurrent.locks.CyclicBarrier
- 生产者消费者模式
- 线程中断机制(
Interrupt
)