Java并发编程
避免死锁的几个常见方法
- 避免同一个线程同时获取多个锁
- 避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源
- 尝试使用定时锁,使用lock.tryLock(timeout) 来替代内部锁机制
- 对于数据库锁,加锁和解锁必须在一个数据库连接中,否则会出现解锁失败的情况。
CAS实现原子操作的三大问题
- ABA问题
- 循环时间长,开销大
- 只能保证一个共享变量的原子操作:可以把多个变量合并成一个变量
线程之间的通信机制
- 共享内存
- 线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信
- 这共享内存并发模型里,同步是显式进行的
- 消息传递
- 线程之间没有公共状态,通过发送消息来显式通信
- 由于消息的发送必须在消息的接收之前,因此同步是隐式进行的
指令重排序
类型:
- 编译器优化的重排序
- 指令级并行的重排序
- 内存系统的重排序