什么是线程安全
java
线程安全是指:当多个线程访问某个类时,无论运行时环境采用何种调度方式或者这些线程如何交替执行,该类始终能表现出正确的行为。
一个类是否线程安全的,取决于两点:是否被多线程共享;状态是否可变。单线程环境中不涉及变量共享,不会产生线程安全性问题。多线程环境中共享无状态的对象和状态不可变的对象也不会产生线程安全性问题。
原子性
对于计数器counter++这种由“ 读取-修改-写入 ”组合而成的操做,在执行过程当中必须当作是一个总体不被分割,不能被打断, 三个子操做要么彻底都不执行,要么三个按顺序依次都执行。
加锁机制
解决线程安全问题的办法就是使用加锁这一同步机制。因为锁能使其保护的代码段以串行形式来访问,至关于让线程以独占的方式来访问状态变量,所以提供了很好的安全性。加锁须要注意一下几点:
一、A线程在得到对象O的锁S以后,B线程若是要获取锁 S 就必须等待A释放锁,可是B任然能够访问对象O的其余未被S加锁的方法(非同步方法 或者 用其余对象做为锁的方法),所以对同一状态变量(或者组合状态)的同步必须使用同一个对象做为锁,不然任然会出现线程安全问题。
二、频繁的获取锁和释放锁自己就很消耗性能,所以在加锁时须要注意一下事项:
A)、只有被多线程同时访问的可变数据才须要加锁保所,为单线程或共享不可变数据而加锁不只毫无意义,并且耗了性能。
B)、尽可能将不影响共享状态且执行时间较长的操做移到同步代码块以外, 使同步代码块的执行时间缩短,也使正在等待的线程在拿到锁以前先将这些操做执行完,一旦拿到锁就能够快速执行完。
编程
以上就是简单介绍下java并发编程与线程安全,若有表述不当敬请谅解!
多线程