讨论线程安全,需要线程之间存在共享数据访问这个前提。
操作共享的 数据 可以分为以下5类:不可变、绝对线程安全、相对线程安全、线程兼容、线程对立。
不可变
不可变的对象一定是线程安全的。对象的方法实现或方法的调用者都不用再采取任何额外的措施。
基本数据类型,只要加上final关键字就可以保证不可变。
如果是对象,则需要保证对象的行为不会对其属性产生影响。如String、Long、Double、BigInteger等。
绝对线程安全
对一些标明线程安全的类,在方法调用端还需要做额外的同步措施才能保证符合线程安全的定义。比如需要将线程安全的对象的读和写操作用一个锁来控制,防止再读后再写的时间段内有另外的线程修改来对象。
相对线程安全
是我们通常意义上讲的线程安全。相对线程安全保证对这个对象单独的操作是线程安全的,即对象本身是线程安全的,但是对于特定顺序的连续操作,就需要在调用端使用额外的同步手段来保证调用的正确性。
Java中大部分的线程安全类都是相对线程安全,如HashTable、Vector、Collections.synchronizedXXXC()等。需要在方法调用段使用同步措施来保证绝对线程安全。
线程兼容
线程兼容指对象本身不是线程安全的,但可以在调用段正确的使用同步手段来保证并发环境中安全的使用。大部分类都是线程兼容的,如ArrayList、HashMap。
线程对立
指无论在调用端是否采取了同步措施,都无法在多线程保证正确。
如Thread.suspend()和Thread.resume(),System.setIn()与System.setOut()/System.runFinalizersOnExit()
《深入理解Java虚拟机》
标签:调用,Java,1.1,对象,兼容,安全,线程,保证 来源: https://blog.csdn.net/Veritas_C/article/details/90299454
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。