同步块的对象参数是否保证可见性 Synchronized Java

问题描述 投票:0回答:1

我无法找到以下案例的答案:

  public class Example {
    int a=0;

    public  synchronized void method(Object x){
        a++;
        x.value=x.value+1;
    }
}

我知道为同一个对象锁建立了发生之前关系,因此所有内容都应该写入内存(但不确定这里的所有内容是否包括对 x 的更改),

我的问题:如果其他线程使用相同的锁,是否保证对对象 x 的更改对其他线程可见? (锁位于示例对象上,但不在 x 本身上)

java multithreading synchronized memory-barriers
1个回答
0
投票

如果其他线程使用相同的锁,对对象

x
的更改是否保证对其他线程可见?

是的,但这可能没用。

首先,我需要将您的示例代码转换为可编译的代码,并可用于说明您的问题。

public class Example {
    int a = 0;

    public  synchronized void method(X x){
        a++;
        x.value = x.value+1;
    }
}

public class X {
    int value;
}   

场景如下:

  1. 创建

    Example
    Shared
    的实例并将其传递给两个线程A和B。

  2. 线程 A 使用公共实例调用

    example.method(x)

  3. 一段时间后,线程 B 使用公共实例调用

    example.method(x)

保证线程 B 将看到 A 写入的

value
变量的更新值或稍后写入的另一个值。

它不能保证同时其他东西没有向

value
写入新值。此外,如果在
x.value
调用之外有任何内容写入
method
... 或使用不同的
Example
实例,那么所有的赌注都会被取消。

换句话说,存在一些有保证的行为,但由于围绕该保证的警告,因此很难利用它们。最好直接锁定

X
实例,或者隐藏它们,以便只能通过
Example
实例访问它们。

© www.soinside.com 2019 - 2024. All rights reserved.