1.状态变量相互关联。线程的安全性定义要求无论是多线程中的时序或交替操作,都要保证不破坏那些不变的约束。
当一个不变的约束涉及多个变量时,变量之间不是彼此独立的:某个变量的值会制约其他变量的值。因此更新一个变量的时候,要在同一原子操作中更新其他几个。
2.法则3:为了保护状态的一致性,要在单一的原子操作中更新相互关联的状态变量。
3.锁机制-synchronized块。java提供了强制原子性的内置锁机制:sychronized块。一个syschronized块有两部分:锁对象的引用,以及这个锁保护的代码块。格式如下:
sychronized (lock){ //访问或修改锁保护的共享状态}
注意,lock是调用方法的所在对象。
4.内部锁(intrinsic locks):每个java对象对可以隐式的扮演一个用于同步的锁的角色;这些内置的锁被称作内部锁。内部锁在java中扮演了互斥锁(mutual exclusion lock)的角色,意味着至多一个线程拥有锁。
注:执行线程进入synchronized块之前会自动获得锁;线程放弃对synchronized块的控制时自动释放锁。
5.内部锁的可重入性。当一个线程请求其他线程占用的锁时,请求线程将被阻塞。然而内部锁是可重入的。因此线程中试图获得它自己占用的锁时,会成功。
注:程序清单2.7,暗示子类和父类中,覆盖的方法是同一个内部锁,因为调用方法的对象是一个。
疑问:如果lock是调用方法所在的对象,那么如果一个类(对象)有多个syschronized块时,那岂不是这些sychronized块都是同一个锁?