9 }
10
11
静态互斥方法实际获得的是当前类 Class 对象的内部锁,前面这个静态方法的相当
于下面写法的互斥语句:
1 public class ClassA{
2
3 public static void addName(String name){
4
5 synchronized(ClassA.class){
6
7 //Adding to static shared list.
8
9 }
10
11 }
12
13 }
14
15
互斥语句在互斥代码开始时获得对象的内部锁,在语句结束或互斥方法返回时释放
锁。互斥语句块相对于互斥方法来说主要有两个作用:
1.避免不必要的死锁。有些被互斥代码块中如果包含其他互斥方法或者代码的调用,
可能会造成死锁。
2.细化互斥的粒度。比如 MsLunch 有两个实例字段 c1 和 c2 从来不一起使用。所有
对这些字段的更新必须互斥进行,但没理由防止 c1 和 c2 两个字段更新操作的交织,这
样也会因不必要的阻塞减小两种操作之间的并发度。可以专门为每个字段定义一个对象锁,
而没必要使用和 this 关联的互斥实例方法:
1 public class MsLunch {
2
3 private long c1 = 0;
4
5 private long c2 = 0;
6
7 private Object lock1 = new Object();
8
9 private Object lock2 = new Object();
10
11 public void inc1() {
12
13 synchronized(lock1) {
14