Java 并发之线程安全_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Java 并发之线程安全

Java 并发之线程安全

 2013/10/8 15:35:29  vivizhyy  程序员俱乐部  我要评论(0)
  • 摘要:写线程安全的代码,说白了就是管理一个类的共享的、可变的状态。只要有多于1个线程对类的状态进行写入,那么就必须用同步来协调这多个线程对状态的访问。对于一个没有状态的类来说(简单的理解就是只有方法没有成员变量,不储存值),它永远都是安全的。而对于有状态的类来说,就要保持其原子性来保证安全。在多线程环境下,一种可能的风险就是check-then-act(竞争条件的一种),就是check的时候条件满足,然后系统状态被别的线程改变了,这时候当前线程不知道thenact,然后错了
  • 标签:Java 线程安全 线程

线程安全的代码,说白了就是管理一个类的共享的、可变的状态。只要有多于 1 个线程对类的状态进行写入,那么就必须用同步来协调这多个线程对状态的访问。对于一个没有状态的类来说(简单的理解就是只有方法没有成员变量,不储存值),它永远都是安全的。而对于有状态的类来说,就要保持其原子性来保证安全。

?

在多线程环境下,一种可能的风险就是 check-then-act (竞争条件的一种),就是 check 的时候条件满足,然后系统状态被别的线程改变了,这时候当前线程不知道 then act, 然后错了。比如用 lazy initialization 就可能出现这种状况,为了避免这种情况,可以把成员变量使用 java.util.concurrent.atomic 包中的原子变量,但是对于包中没有的原子类型,这时候可以考虑对程序加锁。

?

Java 的 Synchronized 块是强制原子性的内部锁,是一种互斥锁Synchronized 块包括 锁 和代码块两个部分,大概长这样:

class="java" name="code">synchronized(lock) {
    // 代码块
}

?

内部锁是可重入的(Reentrancy), 意思就是,同一个线程可以获取它自己占有的锁,而其他的线程不能。

?

为了避免竞争条件,每个共享的可变变量都需要同一个唯一确定的锁来保护。

?

通常来说,简单的并发逻辑和性能是互斥的。耗时的操作,比如网络或者控制台 I/O, 很难快速完成就不要占有锁了

发表评论
用户名: 匿名