Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在从另一个线程读取期间,是否可以读取非易失性变量的过时值?_Java_Concurrency - Fatal编程技术网

Java 在从另一个线程读取期间,是否可以读取非易失性变量的过时值?

Java 在从另一个线程读取期间,是否可以读取非易失性变量的过时值?,java,concurrency,Java,Concurrency,我有一个主线程,它用一个非易失性变量构造一个对象,然后在这个线程中我更改变量的值,并将对象放入BlockingQueue。 在第二个线程中,我等待对象可用并读取对象及其变量 示例代码: public class ReadCheck { static BlockingQueue<A> queue = new LinkedBlockingQueue<>(); public static class A { public int a;

我有一个主线程,它用一个非易失性变量构造一个对象,然后在这个线程中我更改变量的值,并将对象放入BlockingQueue。
在第二个线程中,我等待对象可用并读取对象及其变量

示例代码:

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访问或移除该元素之后的操作之前