繁体   English   中英

为什么线程之间共享静态变量

[英]Why static variable is shared among the threads

在我读过的几乎所有帖子中-

如果两个线程(假设线程1和线程2)正在访问同一个对象并更新声明为static的变量,则意味着线程1和线程2可以在其各自的对象中创建相同对象的本地副本(包括静态变量)相应的缓存,因此线程1将其更新为本地缓存中的静态变量不会反映在线程2缓存的静态变量中。 静态变量用于对象上下文中,其中一个对象的更新将反映在同一类的所有其他对象中,而不是在线程上下文中,其中将一个线程更新为静态变量将立即反映所有线程的更改(在他们的本地缓存)。

但是当我在代码片段下运行时

public class StatciVolatile3 {

    public static void main(String args[]) {
        new ExampleThread2("Thread 1 ").start();
        new ExampleThread2("Thread 2 ").start();
    }

}

class ExampleThread2 extends Thread {
    private static int testValue = 1;

    public ExampleThread2(String str) {
        super(str);
    }

    public void run() {
        for (int i = 0; i < 3; i++) {
            try {
                System.out.println(getName() + " : " + i);
                if (getName().compareTo("Thread 1 ") == 0) {
                    testValue++;
                    System.out.println("Test Value T1: " + testValue);
                }
                if (getName().compareTo("Thread 2 ") == 0) {
                    System.out.println("Test Value T2: " + testValue);
                }
                Thread.sleep(1000);
            } catch (InterruptedException exception) {
                exception.printStackTrace();
            }
        }
    }
}

输出是-

Thread 1  : 0
Thread 2  : 0
Test Value T2: 2
Test Value T1: 2
Thread 2  : 1
Test Value T2: 2
Thread 1  : 1
Test Value T1: 3
Thread 2  : 2
Test Value T2: 3
Thread 1  : 2
Test Value T1: 4

由于线程之间没有共享静态变量,因此对于线程2,测试值应始终为1。但是事实并非如此。

我读了很多其他与同一个问题相关的问题,但是我仍然无法理解为什么会这样。 有人可以帮我理解这个问题。

提前致谢。

我认为您对内存模型的危险感到困惑。

静态变量线程之间共享-您已经阅读尚未想说,每个线程都有自己独立的一套静态变量的文章。 相反,他们一直试图通知您,如果不设置适当的内存屏障,则不能保证未保护的共享状态修改在其他线程中是可见的。 那些更改可以立即对其他线程可见,这是完全可以的-只是不能保证

没有保证的时间间隔,需要Java实现使一个线程所做的更改对另一个线程可见,而无需同步或使用volatile修饰符。

这个想法是让不同的JVM实现者酌情决定(因为他们的实现必须在不同的上下文中在不同的硬件上运行)关于他们希望如何积极地通过缓存,指令重新排序等进行优化。如果将Oracle x86 JVM与ARMv7进行比较,他们将非常不同的选择。

发布的代码是一个玩具示例。 在现实生活中,最好使用并发集合或消息传递。 依靠静态变量形式的共享全局状态是您执行此操作的最混乱的方式。

暂无
暂无

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

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