了解JAVA并发工具常用设计套路

前言

在学习JAVA并发工具时,分析JUC下的源码,发现有三个利器:状态、队列、CAS。

状态

一般是state属性,如AQS源码中的状态,是整个工具的核心,一般操作的执行都要看当前状态是什么,

由于状态是多线程共享的,所以都是volatile修饰,保证线程直接内存可见。

/**

* AbstractQueuedSynchronizer中的状态

*/

private volatile int state;

/**

* Status field, taking on only the values:

* SIGNAL: The successor of this node is (or will soon be)

* blocked (via park), so the current node must

* unpark its successor when it releases or

* cancels. To avoid races, acquire methods must

* first indicate they need a signal,

* then retry the atomic acquire, and then,

* on failure, block.

* CANCELLED: This node is cancelled due to timeout or interrupt.

* Nodes never leave this state. In particular,

* a thread with cancelled node never again blocks.

* CONDITION: This node is currently on a condition queue.

* It will not be used as a sync queue node

* until transferred, at which time the status

* will be set to 0. (Use of this value here has

* nothing to do with the other uses of the

* field, but simplifies mechanics.)

* PROPAGATE: A releaseShared should be propagated to other

* nodes. This is set (for head node only) in

* doReleaseShared to ensure propagation

* continues, even if other operations have

* since intervened.

* 0: None of the above

*

* The values are arranged numerically to simplify use.

* Non-negative values mean that a node doesn't need to

* signal. So, most code doesn't need to check for particular

* values, just for sign.

*

* The field is initialized to 0 for normal sync nodes, and

* CONDITION for condition nodes. It is modified using CAS

* (or when possible, unconditional volatile writes).

*/

volatile int waitStatus;

队列

队列一般由链表实现(单向链表,双向链表),在线程获取不到想要的资源或者状态时,将线程封装成特定节点,扔到等待队列中,等待时机成熟,再从队列中取出,是悲观锁思想。

如AQS中的Node节点,代码太长就不贴了。

CAS

CAS操作是乐观锁思想,是轻量级的并发处理。一般用于对上述状态的修改,而且能保证有且只有一个线程能修改这个状态。

一般由Unsafe类中的compareAndSwap之类的方法实现。使用CAS,往往伴随自旋,如果修改状态失败,则不断地重试,直到修改状态成功。

以上就是java并发编程中的套路,抓住这个思路,想必能在学习中有所帮助。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

JAVA开发需求分析套路_JAVA并发工具常用设计套路示例代码相关推荐

  1. java开发保险案例_Java实现双保险线程的示例代码

    双保险线程,每次启动2个相同的线程,互相检测,避免线程死锁造成影响. 两个线程都运行,但只有一个线程执行业务,但都会检测对方的时间戳 如果时间戳超过休眠时间3倍没有更新的话,则重新启动对方线程. 例子 ...

  2. 【高级Java开发】类QQ聊天工具的设计与实现(代码已上传)

    1.要求 类QQ聊天工具的设计与实现,要求如下: 用户可注册并通过密码录登. 用户可通过查找添加自己的好友. 用户可通过好友列表选择好友并与之对话. 需实现聊天记录查看功能. 界面美观大方,交互设计尽 ...

  3. 用java实现combin函数_Java并发工具类CompletableFuture教程与示例

    Java 8带来了大量的新功能和增强功能,例如Lambda表达式,Streams,CompletableFutures等.在本文中,我将通过简单的示例向您详细说明CompletableFuture及其 ...

  4. Java开发大型互联网高并发架构实战之原理概念分析

    JAVA大飞哥 2019-06-16 21:07:08 引言 高并发是指在同一个时间点,有很多用户同时访问URL地址,比如:淘宝的双11.双12,就会产生高并发.又如贴吧的爆吧,就是恶意的高并发请求, ...

  5. java开发程序员_Java大牛给入门Java开发程序员的10个学习建议

    Java的知识点其实非常多,并且有些知识点比较难以理解,有时候我们自以为理解了某些内容,其实可能只是停留在表面上,没有理解其底层实现原理. 纸上得来终觉浅,绝知此事要躬行. 学习Java基础的时候,应 ...

  6. java 集成开发工具_最好的Java开发人员测试和集成工具

    java 集成开发工具 通过从您的应用程序学习企业APM产品,发现更快,更有效的性能监控. 参加AppDynamics APM导览! 无论您是刚刚起步还是已经从事了一段时间,使用正确的工具进行编程都可 ...

  7. 最好的Java开发人员测试和集成工具

    通过从应用程序中学习企业APM产品,发现更快,更高效的性能监控. 参加AppDynamics APM导览! 无论您是刚开始还是已经使用了一段时间,使用正确的工具进行编程都可以对项目的成功产生巨大的影响 ...

  8. Java开发人员的5种工具

    改善我们编写的Java代码的一种方法是使用最好的工具. 因此,让我们看看IDR Solutions建议使用的5种最常用的工具来帮助Java开发人员编写更好的代码. 查找错误 FindBugs是一个开放 ...

  9. 《码出高效:java开发手册》七 - 并发与多线程

    前言 现代CPU运算速度以百亿计,家用计算机和操作系统也是数十进程,数百线程,程序相应也需要采用多线程和并发的技术 并发和并行:并发是指某个时间段,多任务处理:并行是指同时处理多任务的能力:这两个概念 ...

最新文章

  1. 深度学习入门课程推荐
  2. 【职业规划和代码库设计】
  3. C/C++ 如何劫持别人家的命令||函数||程序(只能对于window而言)
  4. asp.net 将bmp格式图片怎么转换为jpg_PNG图片怎么转换成JPG?原来还可以这么转换...
  5. zabbix3.0.2 使用percona mysql插件来监控mysql5.7的详细实现过程
  6. IOS 归档 即序列化与反序列化
  7. java day19【File类、递归】
  8. matplotlib画图一行三个图
  9. matlab矩阵除法——记忆技巧
  10. PHP api接口开发
  11. 南卡小音舱体验评测:CD级音质听感震撼
  12. CSS3 设置模糊背景图片
  13. Java内存溢出排查(必看)
  14. 勒索病毒SARA,请勿用于非法用途。
  15. 通俗学AI(3):VGG套路得人心
  16. Unity如何在AssetStore寻找需要的资源并下载导入?
  17. 游戏半条命系列人物皮肤壁纸
  18. 最新资讯:浩辰CAD机械2013软件将于6月强势推出
  19. 使用HTML5制作电影影评网
  20. WindTerm屏幕锁定

热门文章

  1. 前端学习(2180):vue-router全局导航守卫
  2. 前端学习(1972)vue之电商管理系统电商系统之弹出修改对话框
  3. “睡服”面试官系列第九篇之数值的扩展(建议收藏学习)
  4. 前端学习(936):缓动动画原理
  5. 前端学习(535):多列布局2
  6. 前端学习(11):标题和段落
  7. 32tomcat的目录结构
  8. 实例54:python
  9. QT中的MessageBox设置自动关闭退出
  10. 理解CSS3 max/min-content及fit-content等width值