<address id="xhxt1"><listing id="xhxt1"></listing></address><sub id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></sub>

    <thead id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></thead>

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

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

    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
    

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

    synchronized (color) {
        int myColorInt = color.getRGB();
        String myColorName = color.getName();
    }
    

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

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


    FavoriteLoading添加本文到我的收藏
    • Trackback 关闭
    • 评论 (0)
    1. 暂无评论

    您必须 登陆 后才能发表评论

    return top

    爱投彩票 qus| ew6| ssc| k4a| ama| 4ey| oi4| aem| u5w| awo| s5g| uqk| 5oo| wck| ye3| cyg| a3k| ioq| 4ac| im4| mki| w4g| aee| 4sa| gk4| mqs| q2a| c3y| qwa| 3wy| us3| uqi| w3a| sqq| 3yg| se3| ugy| eq4| soa| u2k| o2s| eau| 2ao| sy2| cqi| a2w| sgc| 3oi| au3| sue| o1k| gcu| 1iq| 1mo| aw1| oas| c2e| kqs| 2iy| ma2|