静态意味着所有对象的值的一个副本,而volatile意味着所有线程的值的一个副本,这是正确的吗?
不管怎样,一个静态变量值对于所有线程来说都是一个值,那为什么我们要用volatile呢?
静态意味着所有对象的值的一个副本,而volatile意味着所有线程的值的一个副本,这是正确的吗?
不管怎样,一个静态变量值对于所有线程来说都是一个值,那为什么我们要用volatile呢?
当前回答
不确定静态变量是否缓存在线程本地内存中。但是当我执行两个线程(T1,T2)访问同一个对象(obj)时,当T1线程对静态变量进行更新时,它在T2中得到了反映。
其他回答
易失性变量值的访问将直接从主存储器。它应该只在多线程环境中使用。 静态变量将被加载一次。如果它在单线程环境中使用,即使变量的副本将被更新,访问它也不会有任何伤害,因为只有一个线程。
现在,如果静态变量在多线程环境中使用,那么如果有人期望从它得到想要的结果,就会出现问题。由于每个线程都有自己的副本,因此一个线程对静态变量的任何增量或减量可能不会反映在另一个线程中。
如果一个人期望从静态变量得到想要的结果,那么在多线程中使用volatile和static,那么一切都将得到解决。
如果将变量声明为静态,则该变量将只有一个副本。 因此,每当不同的线程访问该变量时,该变量将只有一个最终值(因为仅为该变量分配了一个内存位置)。
如果一个变量被声明为volatile,那么所有线程都将有自己的变量副本,但是值是从主存中取出的。因此,变量在所有线程中的值都是相同的。
因此,在这两种情况下,重点是变量的值在所有线程中是相同的。
我认为静态和不稳定根本没有关系。我建议你阅读java教程了解原子访问,以及为什么使用原子访问,了解什么是交错,你会找到答案。
除了其他的答案,我想为它添加一张图片(图片方便理解)
可以为单个线程缓存静态变量。在多线程环境中,如果一个线程修改了它的缓存数据,这可能不会反映给其他线程,因为他们有一个副本。
Volatile声明确保线程不会缓存数据,只使用共享副本。
图片来源
说静态意味着所有对象的值都有一个副本是不正确的,因为静态意味着加载包含类的每个类加载器只有一个副本。
Java的volatile关键字意味着,对volatile变量的每一次读取都将从计算机的主存中读取,而不是从CPU缓存中读取,对volatile变量的每一次写入都将写入主存,而不仅仅是写入CPU缓存中。