background image

9   }
10 
11
  静态互斥方法实际获得的是当前类 Class 对象的内部锁,前面这个静态方法的相当
于下面写法的互斥语句:
1  public class ClassA{

3   public static void addName(String name){

5   synchronized(ClassA.class){

7   //Adding to static shared list.

9   }
10 
11   }
12 
13   }
14 
15
  互斥语句在互斥代码开始时获得对象的内部锁,在语句结束或互斥方法返回时释放
锁。互斥语句块相对于互斥方法来说主要有两个作用:
  1.避免不必要的死锁。有些被互斥代码块中如果包含其他互斥方法或者代码的调用,
可能会造成死锁。
  2.细化互斥的粒度。比如 MsLunch 有两个实例字段 c1 和 c2 从来不一起使用。所有
对这些字段的更新必须互斥进行,但没理由防止 c1 和 c2 两个字段更新操作的交织,这
样也会因不必要的阻塞减小两种操作之间的并发度。可以专门为每个字段定义一个对象锁,
而没必要使用和 this 关联的互斥实例方法:
1 public class MsLunch {

3   private long c1 = 0;

5   private long c2 = 0;

7   private Object lock1 = new Object();

9   private Object lock2 = new Object();
10 
11   public void inc1() {
12 
13   synchronized(lock1) {
14