繁体   English   中英

Java-同一对象,不同变量,多个线程

[英]Java - Same Object, Different variables, Multiple Threads

我在写一些代码

class A {
    Integer x;
    String y
}

我创建了一个对象A,并将其传递给2个可运行线程。 第一个线程更新值x,而第二个线程更新值y。

有什么情况可以打破吗? 我的意思是,如果有两个线程更新同一对象的不同变量,是否会出现争用情况?

不,可以正常工作。 只要任何给定变量仅由一个线程更新(在某些条件下其他线程读取该变量),您就可以。

根据您正在执行的操作,它可能不是最容易理解的设计-而且,正如我上文提到的那样,如果您希望查看原子对象或volatile,则不要指望从另一个线程可靠地读取这些变量。 (从多个线程进行写操作,原子性将更快,如果仅从一个线程进行写操作而从其他线程进行读取,则volatile可能会更好)

多线程不仅涉及竞争条件,还涉及由以下人员制定的内存可见性
jsr-133 ,如果您想了解Java中的并发性,则必须学习。

代码可能有多种破解方法,一个明显的例子是,如果在线程A中创建对象,则在线程B中更改x,在线程C中创建y,您可能永远不会在线程A中看到这些更改。

一些代码来说明:

A a = new A();
a.x = 0;

Thread t1 = new Thread( () -> {
    while (true) {
        a.x = 1;
    }
});

Thread t2 = new Thread( () -> {
    a.y = "a";
});

t1.start();
t2.start();

while(a.x == 0) {
}

System.out.println("might never get here");

一种可能的解决方法是使x和y易变

class A {
    volatile Integer x;
    volatile String y;
}

这将确保所有线程都能看到对x和y的更改,但是您仍然需要确保A实例安全发布。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM