Oracle官方并发教程之一个同步类的例子

原文链接译文链接,译者:Greenster,校对:郑旭东

SynchronizedRGB是表示颜色的类,每一个对象代表一种颜色,使用三个整形数表示颜色的三基色,字符串表示颜色名称。

[code lang=”java”]
public class SynchronizedRGB {

// Values must be between 0 and 255.
private int red;
private int green;
private int blue;
private String name;

private void check(int red,
int green,
int blue) {
if (red < 0 || red > 255
|| green < 0 || green > 255
|| blue < 0 || blue > 255) {
throw new IllegalArgumentException();
}
}

public SynchronizedRGB(int red,
int green,
int blue,
String name) {
check(red, green, blue);
this.red = red;
this.green = green;
this.blue = blue;
this.name = name;
}

public void set(int red,
int green,
int blue,
String name) {
check(red, green, blue);
synchronized (this) {
this.red = red;
this.green = green;
this.blue = blue;
this.name = name;
}
}

public synchronized int getRGB() {
return ((red << 16) | (green << 8) | blue);
}

public synchronized String getName() {
return name;
}

public synchronized void invert() {
red = 255 – red;
green = 255 – green;
blue = 255 – blue;
name = "Inverse of " + name;
}
}
[/code]

使用SynchronizedRGB时需要小心,避免其处于不一致的状态。例如一个线程执行了以下代码:

[code lang=”java”]
SynchronizedRGB color =
new SynchronizedRGB(0, 0, 0, "Pitch Black");

int myColorInt = color.getRGB(); //Statement 1
String myColorName = color.getName(); //Statement 2
[/code]

如果有另外一个线程在Statement 1之后、Statement 2之前调用了color.set方法,那么myColorInt的值和myColorName的值就会不匹配。为了避免出现这样的结果,必须要像下面这样把这两条语句绑定到一块执行:

[code lang=”java”]
synchronized (color) {
int myColorInt = color.getRGB();
String myColorName = color.getName();
}
[/code]

这种不一致的问题只可能发生在可变对象上。

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Oracle官方并发教程之一个同步类的例子

  • Trackback 关闭
  • 评论 (0)
  1. 暂无评论

return top