1、在single Thread execction 模式下,满足一下条件,死锁就会发生
假设:想吃东西必须拥有叉子和勺子
(1)存在多个sharedResource 包——叉子和勺子
(2)线程在持有着某个SharedResource 角色的锁的同时,还想获取其他SharedResource角色的锁——持有勺子的人想要拿到对方的叉子
(3)获取SharedResource角色的锁的顺序并不固定(SharedResource角色是对称的)——拿叉子相当于拿勺子,两者不分先后顺序
2、synchronized语法和Before/After模式
问:是否可以用lock unlock来取代synchronized?
如:
void method(){
lock();
...
unlock();
}
简单来说没问题,但实际考虑如果方法中由return,则unlock永远不会执行;如果在方法中间由异常抛出,那unlock也不会执行,可以用finally解决
void method(){
lock();
try{
...
}finally{
unlock();
}
}
2、Immutable 模式——不变、不发生改变
对于适用于Immutable模式的类,我们无需使用synchronized方法执行线程的互斥处理,因为及时不使用synchronized,也能确保安全性。
何时使用:
(1)实例创建后,状态不再发生变化时
实例的状态是由字段的值决定的,所以将字段声明为final,且不存在setter方法是重点所在。
(2)实例是共享的,且被频繁访问时