作家
登录

Java并发编程之并发代码设计

作者: 来源: 2017-09-19 16:53:11 阅读 我要评论

如不雅对象本领是可变的,然则法度榜样运行过程中,不存在改变的可能,那么就称为事实弗成变对象,如许也不须要额外的线程安然的保护

同步

当我们不得不应用共享变量,并且须要经常修改的时刻我们就须要应用同步来实现线程安然了。

Java我们可以应用 Synchronized/Lock volatite CAS 来实现同步。

synchronized是一种独有锁,它假设最坏的情况,并且只有在确保其它线程不会造成干扰的情况下履行,会导致其它所有须要锁的线程挂起,等待持有锁的线忱矸⑴锁。

与锁比拟,volatile变量是一和更轻量级的同步机制,因为在应用这些变量时不会产生高低文切换和线程调剂等操作,然则volatile变量也存在一些局限:不克不及用于构建原子的复合操作,是以当一个变量依附旧值时就不克不及应用volatile变量。

CAS是一种乐不雅锁,每次不加锁而是假设没有冲突而去完成某项操作,如不雅因为冲突掉败就重试,直到成功为止。

总结

那么若何设计并发代码解决这个问题呐?

ThreadLocalMap应用ThreadLocal的弱引用作为key,如不雅一个ThreadLocal没有外部强引用来引用它,那么体系 GC 的时刻,这个ThreadLocal势必会被收受接收,如许一来,ThreadLocalMap中就会出现key为null的Entry,就没有办法拜访这些key为null的Entry的value,如不雅当前哨程再迟迟不停止的话,这些key为null的Entry的value就会一向存在一条强引用链:Thread Ref -> Thread -> ThreaLocalMap -> Entry -> value永远无法收受接收,造成内存泄漏。

懂得线程安然的概念很重要, 所谓线程安然问题,就是处理对象状况的问题 。如不雅要处理的对象是无状况的(不变性),或者可以避免多个线程共享的(线程封闭),那么我们可以宁神,这个对象可能是线程安然的。当无法避免,必须要共享这个对象状况给多线查拜访时,这时刻才用到线程同步的一系列技巧。

这个懂得放大年夜到架构层面,我们来设计营业层代码时,营业层最好做到无状况,如许就营业层就具备了可伸缩性,可以经由过程横向扩大腻滑应对高并发。

所以我们处理线程安然可以有几个层次:

  1. 可否做成无状况的不变对象。无状况是最安然的。
  2. 可否线程封闭
  3. 采取何种同步技巧 (Synchronized/Lock volatite CAS) 

【编辑推荐】

  1. JavaScript感化域和闭包
  2. 25个最根本的JavaScript面试问题及谜底
  3. 30行JavaScript代码,教你分分钟创建神经收集
  4. IBM J9 Java虚拟机正式开源,供献给Eclipse基金会治理
  5. Java 虚拟机 OpenJ9 和 Hotspot 的 Benchmark 测试
【义务编辑:庞桂玉 TEL:(010)68476606】

  推荐阅读

  Web的现状:网页性能提升指南

【沙龙】51CTO诚邀您9月23号和多位技巧大年夜咖一路聊智能CDN的优化之路,抓紧时光哦! 互联网成长异常敏捷,所以我们创造了Web平台。平日 我们会忽视连通性等问题,但用户们却不会熟视无睹>>>详细阅读


本文标题:Java并发编程之并发代码设计

地址:http://www.17bianji.com/lsqh/37528.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)