博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
并发工具优于wati、notify(69)
阅读量:6694 次
发布时间:2019-06-25

本文共 1094 字,大约阅读时间需要 3 分钟。

hot3.png

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

d368166e1b60629792030c8bf6ebebe50d1.jpg

4ee4184bf6ed68d230e0abc6ebc9557746e.jpg

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

  • 循环里面就一个wait 语句,别的事都不做
synchronized (monitor) {    //  判断条件谓词是否得到满足    while(!locked) {        //  等待唤醒        monitor.wait();    }    //  处理其他的业务逻辑}

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

synchronized (monitor) {    //  判断条件谓词是否得到满足    if(!locked) {        //  等待唤醒        monitor.wait();    }    //  处理其他的业务逻辑}

转载于:https://my.oschina.net/u/3847203/blog/2988680

你可能感兴趣的文章
扩展访问:Uber Lite App开发始末
查看>>
采访与书评 —— 《BDD In Action》
查看>>
网络数据发送过程
查看>>
AlphaZero进化论:从零开始,制霸所有棋类游戏
查看>>
OpsRamp推出AIOps推理引擎
查看>>
如何用React + Rxjs实现一个虚拟滚动组件?
查看>>
蚂蚁金服开源服务注册中心 SOFARegistry
查看>>
乐变黄杲:当前如何选择App热更新服务
查看>>
新Rider预览版发布,对F#的支持是亮点
查看>>
2018年Java展望
查看>>
Flink关系型API解读:Table API 与SQL
查看>>
爱奇艺短视频软色情识别技术解析
查看>>
腾讯云宣布核心产品全线降价,最高降幅达50%
查看>>
理解JavaScript中的this
查看>>
云帮一周问答集锦(10.31-11.06)
查看>>
mysql全文索引的原理
查看>>
Node.js + Redis Sorted Set 任务队列
查看>>
验证码破解技术四部曲之使用Tesseract(二)
查看>>
Retrofit2.0 公共参数(固定参数)
查看>>
webpack使用之基础篇
查看>>