当前位置: 首页 > 面试题库 >

Java中的Volatile与Static

公西良骏
2023-03-14
问题内容

static对所有对象而言值的volatile一个副本和对所有线程而言值的一个副本是否正确?

无论如何,static变量值也将成为所有线程的一个值,那么为什么要这样做volatile呢?


问题答案:

在Java中声明一个静态变量,意味着将只创建一个副本,而不管该类创建了多少个对象。即使根本没有Objects创建,也可以访问该变量。但是,线程可能具有其本地缓存的值。

当变量是易变的而不是静态的时,每个变量将只有一个Object。因此,从表面上看,它与普通变量没有什么区别,但与static完全不同。但是,即使具有Object字段,线程也可以在本地缓存变量值。

这意味着,如果两个线程同时更新同一对象的变量,并且该变量未声明为volatile,则可能存在其中一个线程在缓存中保留旧值的情况。

即使你通过多个线程访问静态值,每个线程也可以拥有其本地缓存副本!为避免这种情况,你可以将变量声明为static volatile,这将强制线程在每次全局值时读取。

但是,volatile不能替代适当的同步!
例如:

private static volatile int counter = 0;

private void concurrentMethodWrong() {
  counter = counter + 5;
  //do something
  counter = counter - 5;
}

concurrentMethodWrong同时执行多次可能会导致计数器的最终值不同于零!
要解决该问题,你必须实现一个锁:

private static final Object counterLock = new Object();

private static volatile int counter = 0;

private void concurrentMethodRight() {
  synchronized (counterLock) {
    counter = counter + 5;
  }
  //do something
  synchronized (counterLock) {
    counter = counter - 5;
  }
}

或使用AtomicInteger该类。



 类似资料:
  • 本文向大家介绍java中volatile和synchronized的区别与联系,包括了java中volatile和synchronized的区别与联系的使用技巧和注意事项,需要的朋友参考一下 java中volatile和synchronized的区别与联系 这个可能是最好的对比volatile和synchronized作用的文章了。volatile是一个变量修饰符,而synchronized是一个

  • 本文向大家介绍Java中的volatile关键字,包括了Java中的volatile关键字的使用技巧和注意事项,需要的朋友参考一下 volatile修饰符用于让JVM知道访问该变量的线程必须始终将其自身的变量私有副本与内存中的主副本合并。 访问易失性变量将同步所有在主存储器中缓存的变量副本。可变变量只能应用于对象类型或私有类型的实例变量。易失性对象引用可以为null。 示例

  • 本文向大家介绍Java中volatile关键字的作用与用法详解,包括了Java中volatile关键字的作用与用法详解的使用技巧和注意事项,需要的朋友参考一下 volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。 volatile 关键字作用

  • 我目前正在学习多线程,我发现了一些我无法解释的有趣的东西。据我所知,如果两个线程访问一个静态变量,它们可以将自己的副本复制到缓存中。Thread1对其本地缓存中的静态变量进行的更新不会反映在Thread2缓存的静态变量中。 java java

  • Volatile关键字 Volatile就是防优化。Volatile一般和硬件有关,指向硬件的内容可能我们需要不要让编译器去优化,每次都要读取那里的内容。比如我们在实际操作中有一个键盘,我们查看一个按键是否被按下,就是通过读取内存里面关于按键状态的高低电平来识别。那么我们怎么来读取这一个位里面的状态(0或1)?我们能够访问到最小的内存地址就是一个字节,而一个字节里面有8个位。所以我们只能利用一个u

  • 本文向大家介绍Java中volatile和transient之间的区别,包括了Java中volatile和transient之间的区别的使用技巧和注意事项,需要的朋友参考一下 volatile关键字用于多线程环境中,其中两个线程同时读取和写入同一变量。volatile关键字将更改直接刷新到主内存,而不是CPU缓存。  另一方面,在序列化过程中使用了transient关键字。标记为瞬态的字段不能成为