实例的同步方法可以被同步语句锁定吗

我自己Safaoglu

我在并发的官方教程中遇到了一段代码:

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;
    }
}

我的问题是:

如果一个线程使用set方法,则另一个线程可以使用其中一个同步方法,还是相反?

我的世界三叶草

不,他们不能。至少在您位于synchronized(this)区内时不是如此将非静态方法声明为synchronized与将方法内部的所有内容放入一个synchronized(this) {}具有相同的效果

因此,当一个线程位于声明为的非静态方法内部时synchronized,其他任何线程都不能执行synchronized方法或synchronized(this) {}块。

对于static在类中声明的方法ThisClass:处理方法的方式与方法的内容在synchronized(ThisClass.class) {}块内一样。


对于您的示例,如果您想知道为什么这不能正常工作:

SynchronizedRGB color = new SynchronizedRGB(0, 0, 0, "Pitch Black");
...
int myColorInt = color.getRGB();      //Statement 1
String myColorName = color.getName(); //Statement 2

getRGB()getName()锁定this但是在这两个方法调用之间再次释放了锁,以便另一个线程可以获取该锁,然后释放它,只有第一个线程才可以最终执行getName()因此,另一个线程可能会更改theRGBNamegetter之间的颜色,因此返回的名称和RGB将不适合同一颜色。

如果您这样做:

SynchronizedRGB color = new SynchronizedRGB(0, 0, 0, "Pitch Black");
...
synchronized(color) {
    int myColorInt = color.getRGB();      //Statement 1
    String myColorName = color.getName(); //Statement 2
}

在这种情况下,对象之间的锁定不会在之间释放getRGB()getName()因此此时没有线程可以获取它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我可以使覆盖的方法同步吗?

来自分类Dev

同步语句-同步方法和同步语句是否等效?

来自分类Dev

扩展类同步方法锁定

来自分类Dev

同步方法是否对此锁定

来自分类Dev

同步双重检查锁定后为Android吗?

来自分类Dev

offlineimap可以单向同步吗?

来自分类Dev

Android 访问来自不同线程的活动的相同实例方法,无需锁定。添加同步方法

来自分类Dev

Java中的同步实例方法

来自分类Dev

进入非同步块时,同步方法是否释放锁定?

来自分类Dev

在Eclipse中,如何查找锁定特定类实例的所有Java同步块/方法

来自分类Dev

在Eclipse中,如何查找锁定特定类实例的所有Java同步块/方法

来自分类Dev

Java 中可以同步测试方法吗?

来自分类Dev

实例同步

来自分类Dev

JPA乐观锁定与同步Java方法

来自分类Dev

同步方法可能未释放锁定

来自分类Dev

Java同步方法未锁定对象

来自分类Dev

同步中心可以自动解决同步冲突吗?

来自分类Dev

锁定和同步

来自分类Dev

如何同步/锁定变量?

来自分类Dev

可以在gitHub中自动同步fork吗?

来自分类Dev

Dart可以有同步API吗?

来自分类Dev

吸气剂也可以使动作同步吗?

来自分类Dev

我可以同步Sublime Text吗?

来自分类Dev

同步后GlusterFS可以通知吗?

来自分类Dev

iTunes可以替代iTunes与iPhone同步吗?

来自分类Dev

我可以同步运行 ytdl getInfo() 吗?

来自分类Dev

语句执行与同步方法执行交织

来自分类Dev

语句执行与同步方法执行交织

来自分类常见问题

有什么方法可以在实例之间同步我的Visual Studio Code设置?