Java并发编程笔记_线程安全性

编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享的(shared)和可变的(Mutable)状态的访问。

 

Java中同步属于可以包括:

1)synchronized关键字,一种独占加锁方式(内置锁)

2)volatile类型的变量

3)显式锁(Explicit Lock

4)原子变量

 

如果当多个线程访问同一个可变的状态变量时没有使用合适的同步,那么程序就会出现错误。有三种方式可以修复这个问题:

1)不在线程之间共享该状态变量

2)将状态变量修改为不可变的变量

扫描二维码关注公众号,回复: 710911 查看本文章

3)在访问状态变量时使用同步

 

当设计线程安全的类时,良好的面向对象技术、不可修改性,以及明晰的不可变性规范都能起到一定的帮助作用。

 

线程安全定义:当多个线程访问某个类时,不管与运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协调,这个类都能表现出正确行为,那么就称这个类时线程安全的。

 

无状态对象一定是线程安全的。

 

竞态条件:程序执行的正确性取决于多线程交替执行的时序,这时就会产生竞态条件。常见的竞态条件有以下场景:

1)先检查后执行(非线程安全的懒加载)

2)读取-修改-写入(++运算)

 

在实际情况中,应尽可能地使用现有的线程安全对象(例如:AtomicLong)来管理类的状态。与非线程安全的对象相比,判断线程安全对象的可能状态及其状态转换情况要更为容易,从而也更容易维护和验证线程安全性。

 

要保持状态的一致性,就需要在单个原子操作中更新所有相关的状态变量。

 

通常,在简单性与性能之间存在着相互制约因素。当实现某个同步策略时,一定不要盲目地为了性能二牺牲简单性(这可能会破坏安全性)。

 

当执行时间较长的计算或者可能无法快速完成的操作时(例如,网络I/O或控制台I/O),一定不要持有锁。

猜你喜欢

转载自aimarcby.iteye.com/blog/2266337