现在几乎没有理由在使用wait 和 notify,使用高级工具代替
java.util.concurrent 包并发工具分三类:
Executor 框架
并发集合(concurrent Collection)
同步器(synchronizer)
并发集合
对标准集合接口(List、Map、Queue)封装了高性能的并发实现
为了提高并发性,实现了内部管理同步
除非不得已,请优先使用ConcurrentHashMap
相较于普通 Map ,极大提升了性能
String#intern方法中看到,
这个方法是一个 native 的方法,但注释写的非常明了。
“如果常量池中存在当前字符串, 就会直接返回当前字符串.
如果常量池中没有此字符串, 会将此字符串放入常量池中后, 再返回”。
阻塞操作(BlockingQueue)::
一直阻塞直到被成功执行为止
take 方法删除并返回头元素,队列为空就等待
大部分 ExecutorService 都是用Blockingqueue
同步器(Synchronizer)::
使一个线程能够等待另一个线程,允许他们协调动作
常用同步器有semaphore、CountDownLatch
不常用的有CyclicBarrier、ExChanger
倒计数锁存器(CountDownLatch)::
System.nanoTime()
精度更高
优先使用他,而不是currentTimeMillis
用于计算时间差
使用wait
始终应该使用循环模式来调用wait
永远不要在循环外调用wait
循环会在等待之前和之后调用测试条件
(!!!这个很重要,这就是这里 while 不能换成if的原因)
在多线程的编程实践中,wait()的使用方法如下:
循环里面就一个wait 语句,别的事都不做
synchronized (monitor) {
// 判断条件谓词是否得到满足
while(!locked) {
// 等待唤醒
monitor.wait();
}
// 处理其他的业务逻辑
}
那为什么非要while判断,而不采用if判断呢?如下:
synchronized (monitor) {
// 判断条件谓词是否得到满足
if(!locked) {
// 等待唤醒
monitor.wait();
}
// 处理其他的业务逻辑
}