java并发编程与线程安全

jopen 8年前

什么是线程安全

如果对象的状态变量(对象的实例域、静态域)具有可变性,那么当该对象被多个线程共享时就的考虑线程安全性的问题,否则很可能出现与预期不同的结果。

线程安全是指:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程如何交替执行,该类始终能表现出正确的行为。

一个类是否线程安全的,取决于两点:是否被多线程共享;状态是否可变。单线程环境中不涉及变量共享,不会产生线程安全性问题。多线程环境中共享无状态的对象和状态不可变的对象也不会产生线程安全性问题。

原子性

对于计数器counter++这种由“ 读取-修改-写入 ”组合而成的操作,在执行过程中必须当做是一个整体不被分割,不能被打断, 三个子操作要么完全都不执行,要么三个按顺序依次都执行。

加锁机制

解决线程安全问题的办法就是使用加锁这一同步机制。由于锁能使其保护的代码段以串行形式来访问,相当于让线程以独占的方式来访问状态变量,因此提供了很好的安全性。加锁需要注意一下几点:
1、A线程在获得对象O的锁S之后,B线程如果要获取锁 S 就必须等待A释放锁,但是B任然可以访问对象O的其他未被S加锁的方法(非同步方法 或者 用其他对象作为锁的方法),因此对同一状态变量(或者组合状态)的同步必须使用同一个对象作为锁,否则任然会出现线程安全问题。

2、频繁的获取锁和释放锁本身就很消耗性能,因此在加锁时需要注意一下事项:

A)、只有被多线程同时访问的可变数据才需要加锁保所,为单线程或共享不可变数据而加锁不仅毫无意义,而且耗了性能。

B)、尽量将不影响共享状态且执行时间较长的操作移到同步代码块之外, 使同步代码块的执行时间缩短,也使正在等待的线程在拿到锁之前先将这些操作执行完,一旦拿到锁就可以快速执行完。

C)、同步代码块不应拆解的过细,需要在安全性、简单性和性能上进行权衡。

 

以上就是简单介绍下java并发编程与线程安全,如有表述不当敬请谅解!

来自: http://www.elsyy.com/news/2014/0630/3910032050_2.html