Java 在从另一个线程读取期间,是否可以读取非易失性变量的过时值?
我有一个主线程,它用一个非易失性变量构造一个对象,然后在这个线程中我更改变量的值,并将对象放入BlockingQueue。Java 在从另一个线程读取期间,是否可以读取非易失性变量的过时值?,java,concurrency,Java,Concurrency,我有一个主线程,它用一个非易失性变量构造一个对象,然后在这个线程中我更改变量的值,并将对象放入BlockingQueue。 在第二个线程中,我等待对象可用并读取对象及其变量 示例代码: public class ReadCheck { static BlockingQueue<A> queue = new LinkedBlockingQueue<>(); public static class A { public int a;
在第二个线程中,我等待对象可用并读取对象及其变量 示例代码:
public class ReadCheck {
static BlockingQueue<A> queue = new LinkedBlockingQueue<>();
public static class A {
public int a;
public A(int a) {
this.a = a;
}
}
public static void main(String[] args) throws InterruptedException {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
A a = queue.take();
if (a.a != 20) {
System.out.println(a.a);
}
} catch (InterruptedException e) {
}
}
}
}).start();
while (true) {
A a = new A(10);
a.a = 20;
queue.offer(a);
}
}
}
公共类读取检查{
静态BlockingQueue=新建LinkedBlockingQueue();
公共静态A类{
公共INTA;
公共A(INTA){
这个a=a;
}
}
公共静态void main(字符串[]args)引发InterruptedException{
新线程(newrunnable()){
@凌驾
公开募捐{
while(true){
试一试{
A=队列.take();
如果(a.a!=20){
系统输出打印LN(a.a);
}
}捕捉(中断异常e){
}
}
}
}).start();
while(true){
A=新的A(10);
a、 a=20;
排队。报价(a);
}
}
}
在示例运行期间,我从未见过变量是10(总是20)。在这种情况下,我是否可能在第二个线程中读取变量的过时值(10)?
这个代码示例是线程安全的吗 不,您不能读取过时的值;是的,它是线程安全的 该要约发生在take之前,因此对
A.A
中的值的写入将发生在您读取它之前
与其他并发集合一样,在将对象放入BlockingQueue之前,线程中的操作发生在另一个线程中从BlockingQueue访问或移除该元素之后的操作之前
不,您不能读取过时的值;是的,它是线程安全的 该要约发生在take之前,因此对
A.A
中的值的写入将发生在您读取它之前
与其他并发集合一样,在将对象放入BlockingQueue之前,线程中的操作发生在另一个线程中从BlockingQueue访问或移除该元素之后的操作之前