线程同步机制
同步方式对比
flowchart TD
subgraph 同步机制
sync[synchronized]
lock[ReentrantLock]
atomic[原子类]
collection[并发集合]
end
锁优化技术
- 锁消除:JIT编译器消除不必要的锁
- 锁粗化:合并多个同步块
- 偏向锁:无竞争时减少开销
- 自旋锁:短时间等待不挂起线程
- 锁升级:偏向锁->轻量级锁->重量级锁
并发集合示例
// 1. ConcurrentHashMap
Map<String, Integer> map = new ConcurrentHashMap<>();
map.put("a", 1);
// 2. CopyOnWriteArrayList
List<String> list = new CopyOnWriteArrayList<>();
list.add("item");
// 3. BlockingQueue
BlockingQueue<String> queue = new ArrayBlockingQueue<>(10);
queue.put("task");
String task = queue.take();
线程通信方式
// 1. wait/notify
synchronized(lock) {
while(!condition) {
lock.wait();
}
// 处理逻辑
lock.notifyAll();
}
// 2. Condition
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
lock.lock();
try {
while(!conditionMet) {
condition.await();
}
// 处理逻辑
condition.signal();
} finally {
lock.unlock();
}
// 3. CountDownLatch
CountDownLatch latch = new CountDownLatch(3);
// 线程中调用 latch.countDown();
latch.await(); // 等待计数归零
最佳实践
- 优先使用并发集合
- 减小同步范围
- 避免嵌套锁
- 使用读写锁提高读性能
- 考虑使用无锁算法