如不雅对象本领是可变的,然则法度榜样运行过程中,不存在改变的可能,那么就称为事实弗成变对象,如许也不须要额外的线程安然的保护
同步
当我们不得不应用共享变量,并且须要经常修改的时刻我们就须要应用同步来实现线程安然了。
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永远无法收受接收,造成内存泄漏。
懂得线程安然的概念很重要, 所谓线程安然问题,就是处理对象状况的问题 。如不雅要处理的对象是无状况的(不变性),或者可以避免多个线程共享的(线程封闭),那么我们可以宁神,这个对象可能是线程安然的。当无法避免,必须要共享这个对象状况给多线查拜访时,这时刻才用到线程同步的一系列技巧。
这个懂得放大年夜到架构层面,我们来设计营业层代码时,营业层最好做到无状况,如许就营业层就具备了可伸缩性,可以经由过程横向扩大腻滑应对高并发。
所以我们处理线程安然可以有几个层次:
- 可否做成无状况的不变对象。无状况是最安然的。
- 可否线程封闭
- 采取何种同步技巧 (Synchronized/Lock volatite CAS)
【编辑推荐】
- JavaScript感化域和闭包
- 25个最根本的JavaScript面试问题及谜底
- 30行JavaScript代码,教你分分钟创建神经收集
- IBM J9 Java虚拟机正式开源,供献给Eclipse基金会治理
- Java 虚拟机 OpenJ9 和 Hotspot 的 Benchmark 测试
推荐阅读
【沙龙】51CTO诚邀您9月23号和多位技巧大年夜咖一路聊智能CDN的优化之路,抓紧时光哦! 互联网成长异常敏捷,所以我们创造了Web平台。平日 我们会忽视连通性等问题,但用户们却不会熟视无睹>>>详细阅读
本文标题:Java并发编程之并发代码设计
地址:http://www.17bianji.com/lsqh/37528.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示