当前位置:  首页>> 技术小册>> Java面试指南

Java关键字Volatile介绍

在Java中,关键字Volatile可以用来保证变量在多线程环境下的可见性和禁止指令重排优化。

当一个变量被声明为Volatile时,Java虚拟机会保证每个线程都能够及时获取该变量的最新值,而不是使用该线程的本地缓存值。这样可以避免由于线程之间的数据不一致导致的并发问题,例如死锁和数据丢失等。

Volatile还可以防止编译器和处理器进行指令重排优化。在不使用Volatile的情况下,编译器和处理器可能会通过优化代码的执行顺序来提高程序的性能。然而,这样的优化可能会导致程序在多线程环境下出现错误,例如出现脏读等情况。使用Volatile可以禁止这种优化,保证代码的正确性。

下面是一个使用Volatile的示例:

  1. public class Counter {
  2. private volatile int count = 0;
  3. public void increment() {
  4. count++;
  5. }
  6. public int getCount() {
  7. return count;
  8. }
  9. }
  10. public class Main {
  11. public static void main(String[] args) {
  12. Counter counter = new Counter();
  13. Thread t1 = new Thread(() -> {
  14. for (int i = 0; i < 10000; i++) {
  15. counter.increment();
  16. }
  17. });
  18. Thread t2 = new Thread(() -> {
  19. for (int i = 0; i < 10000; i++) {
  20. counter.increment();
  21. }
  22. });
  23. t1.start();
  24. t2.start();
  25. try {
  26. t1.join();
  27. t2.join();
  28. } catch (InterruptedException e) {
  29. e.printStackTrace();
  30. }
  31. System.out.println(counter.getCount());
  32. }
  33. }

在上面的代码中,Counter类的count变量被声明为Volatile。我们创建了两个线程来分别对count变量进行10000次自增操作,并在主线程中等待两个线程执行完毕后输出count变量的值。

如果没有使用Volatile,程序可能会出现多种结果,因为每个线程都有可能使用自己的本地缓存值。但是,由于使用了Volatile,我们可以确保每个线程都能够获取最新的count变量值,并且最终输出的结果也是正确的。


该分类下的相关小册推荐: