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 是可变对象时才会发生,对于常量版