这里总结一下Java提供的一些多线程开发工具。
- Atomic变量
- 代码排斥/等待,唤醒
- 锁
- Semaphore
- Latch / Cyclic Barrier
- Exchanger
- Volatile
- Final
- Concurrent Map
- CopyOnWriteArrayList
- Executor
Atomic变量
Atomic变量最主要的是解决了普通Java变量读写操作的原子性问题。其提供了好多方法把对一个变量需要同时做的事情合并在一起,例如AddAndGet,DecreaseAndGet。另外还有compareAndSet的方法,这个有点特别是非阻塞的,后面会详细论述。
优点就是:简单,只要把例如Integer换成AtomicInteger就可。运行效率高,不会导致死锁。
限制:只能用于单个共享变量的场景。
代码块排斥/等待,唤醒
通过提供了synchronize, wait, notify, notifyAll的这几个机制,我们可以实现到对代码块的排斥和控制,包括
- 正常进入排斥区 Monitor Enter
- 正常离开排斥区 Monitor Exit
- 等待某条件成熟暂时离开排斥区 Monitor Exit
- 已具备条件重新进入排斥区 Monitor Enter
经典的代码段像下面,通过组合几个关键词可以实现到通过逻辑控制某代码块的执行与否。
Integer i=0;
public void toConsume() throws InterruptedExcept