background image

29             this.green = green;
30             this.blue = blue;
31             this.name = name;
32         }
33     }
34 
35     public synchronized int getRGB() {
36         return ((red << 16) | (green << 8) | blue);
37     }
38 
39     public synchronized String getName() {
40         return name;
41     }
42 
43     public synchronized void invert() {
44         red = 255 - red;
45         green = 255 - green;
46         blue = 255 - blue;
47         name = "Inverse of " + name;
48     }
49 }
50 
51
 
  程序员必须小心使用这个 SynchronizedRGB 类,避免出现不一致状态的情况。比如
假设某线程执行下面的代码:
1 SynchronizedRGB color = new SynchronizedRGB(0, 0, 0, "Pitch Black");
2 ...
3 int myColorInt = color.getRGB();      //Statement 1
4 String myColorName = color.getName(); //Statement 2
5
 
    然 而 此 时 如 果 另 外 一 个 线 程 在 1 语 句 和 2 语 句 之 间 调 用 了 color.set 方 法 , 
myColorInt 值就不能匹配 myColorName 值。为避免这种结果,两条语句必须合并在一
起互斥执行:
1 synchronized (color) {
2     int myColorInt = color.getRGB();
3     String myColorName = color.getName();
4 }
5
 
         这种不一致情况只在当 SynchronizedRGB 是可变对象时才会发生,对于常量版