第二章 线程安全性
定义:当多个线程访问某个类时,这个类始终能表现出正确的行为。
2.1
-
无状态对象一定是线程安全的
-
不包含任何属性
-
不包含对其他类属性的引用
-
2.2 原子性
-
++ 操作并非原子性,不安全
-
竞态条件:在并发编程中,由于不恰当的执行时序而出现不正确的结果
-
最常见:先检查后执行操作;++:基于错误的结果做判断
-
一个时间差,系统状态发生改变:2人约在咖啡厅见,但是去了有2个咖啡厅
-
正确的执行结果取决于事件发生的时序
-
-
原子类操作:
java.util.concurrent.atomic
-
不良并发
-
可同时调用的资源数量,不仅受到可用处理资源的限制,还受程序本身结构的限制
-
-
简单性与性能之间存在相互制约因素
-
当执行时间较长的计算,一定不要持有锁
2.3 加锁机制
-
内置锁:synchronized
-
同步代码块,以原子方式执行
-
静态synchronized方法以Class对象作为锁
-
是一种互斥锁:即最多只有一个线程能持有该锁-->等待或堵塞
-
-
重入
-
某线程试图获得一个他已经持有的锁,该请求会成功
-
内置锁是可重入的
-
锁的操作粒度是线程,不是调用
-
2.5 活跃性与性能
-
-
不良并发
-
可同时调用的资源数量,不仅受到可用处理资源的限制,还受程序本身结构的限制
-
-
简单性与性能之间存在相互制约因素
-
当执行时间较长的计算,一定不要持有锁