[英]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.