Spec-Zone .ru
спецификации, руководства, описания, API
|
class,
, определяет объекты, которые представляют цвета. Каждый объект представляет цвет как три целых числа, которые обозначают значения основного цвета и строку, которая дает имя цвета.SynchronizedRGB
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; } }
SynchronizedRGB
должен использоваться тщательно, чтобы избежать замечаться в непоследовательном состоянии. Предположите, например, поток выполняет следующий код:
SynchronizedRGB color = new SynchronizedRGB(0, 0, 0, "Pitch Black"); ... int myColorInt = color.getRGB(); //Statement 1 String myColorName = color.getName(); //Statement 2
Если другой поток вызывает color.set
после Оператора 1, но перед Оператором 2, значением myColorInt
не будет соответствовать значение myColorName
. Чтобы избежать этого результата, эти два оператора должны быть связаны:
synchronized (color) { int myColorInt = color.getRGB(); String myColorName = color.getName(); }
Этот вид несогласованности только возможен для изменчивых объектов — это не будет проблема для неизменной версии SynchronizedRGB
.