wat java_并发工具优于wati、notify(69)

现在几乎没有理由在使用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的原因)

b2aef70c741799493dc817c9d1fb1599.png

e0730550730e46201e0f7f58e7e94078.png

在多线程的编程实践中,wait()的使用方法如下:

循环里面就一个wait 语句,别的事都不做

synchronized (monitor) {

//  判断条件谓词是否得到满足

while(!locked) {

//  等待唤醒

monitor.wait();

}

//  处理其他的业务逻辑

}

那为什么非要while判断,而不采用if判断呢?如下:

synchronized (monitor) {

// 判断条件谓词是否得到满足

if(!locked) {

// 等待唤醒

monitor.wait();

}

// 处理其他的业务逻辑

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值