线程安全性
当多个线程访问某个类时,这个类始终能表现出正确的行为时,那么就称这个类是线程安全的。
始终就意味着与多个线程的执行时序无关,并不需要在调用程序时执行额外的同步管理,如何折腾都能保证这个类的正确执行,而什么谓之正确执行,我想就是类的对象变量和静态变量表现正确吧,数据可预知,能够按照猜想执行下去,不违反类内部的约定条件(比如说我设计一个类,要求包含两个数值,A必须大于B,这个就是类的条件)。如何验证猜想也就只能写测试用例了。
如何分析一个类是否是需要线程安全或者如何判断这个类是安全的,(1)这个类是否有可能被多个线程去访问,如果只由单个线程去访问,我们就无需继续往下分析了。(2)如果类须由多个线程访问,那么,我们就要找出类是否设计有静态变量和对象变量,如果没有静态变量或者对象变量,那么我们可以称这个类为无状态类,由于只存在局部变量,局部变量全部封装在线程栈区内,而线程不存在共享变量,所以线程安全性也就不需要考虑了。(3)若存在静态变量或者对象变量,先分析这些变量是否全为可变的,这个类又有可能被多个线程访问,那么则需要一些手段去保证这个类的状态的线程安全性。
常常用到的设计手段
(1)将唯一状态托管给线程安全类,注意是唯一状态,也就是只有一个对象变量或者静态变量,若状态不唯一,那么仅使用线程安全类是不足够的。
(2)同步操作,对操作变量的接口使用synchronized进行协同步调的操作。
(3)使用volatile关键字。volatile其实是一种弱化的同步操作。
在进行一个安全类设计的时候,我们常常需要在安全性和线程活跃性能之间抉择。要设计一个安全的类其实很简单,你对每个方法进行synchronized就可以了,但是这样会大大的浪费cpu性能。我们通常会尽量缩减同步代码块的区域来获得良好的活跃性能和安全性。