Java volatile变量是一种特殊的变量,它的值可以在多个线程之间共享。它的特性是,当一个线程修改了volatile变量的值,其他线程能够立即看到这个修改。
Java volatile变量有助于解决多线程并发访问共享数据时出现的问题。当多个线程同时访问一个共享数据时,如果不使用volatile变量,就会出现数据不一致的情况。这是因为在Java中,当一个线程修改了共享数据时,它会将修改后的值存储在本地内存中,而不会马上将该值同步到主内存中。这样其他的线程就无法看到该值的修改,从而导致数据不一致的情况出现。
使用volatile变量来解决这个问题很容易。当一个volatile变量被修改时,JVM会立即将该值同步到主内存中,而不是将其存储在本地内存中。这样就能够保证所有的线程都能够看到该值的修改,从而避免出错。
public class VolatileExample { private volatile int counter = 0; public void increase() { counter++; } public int getCounter() { return counter; } }
关键字volatile可以保持线程的工作内存中的变量值与它们在主存储器中的值同步。
我们可以声明一个变量volatile如下:
volatile boolean flag = true;
我们可以只声明一个类成员变量,实例或静态字段,作为volatile。
我们可以使用volatile变量作为标志来停止线程。
下面的代码演示了volatile变量的使用。
public class Main extends Thread { private volatile boolean keepRunning = true; public void run() { System.out.println("Thread started"); while (keepRunning) { try { System.out.println("Going to sleep"); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("Thread stopped"); } public void stopThread() { this.keepRunning = false; } public static void main(String[] args) throws Exception{ Main v = new Main(); v.start(); Thread.sleep(3000); System.out.println("Going to set the stop flag to true"); v.stopThread(); } }
上面的代码生成以下结果。
Java线程教程 -Java线程生命周期线程总是处于以下六种状态之一:NewRunnableBlockedWaitingTimed-waitingTerminated线程的所有这...
Java线程教程 -Java同步器同步器对象与一组线程一起使用。它维护一个状态,根据它的状态,它让一个线程通过或强迫它等待。本节将...
Java网络教程 -Java URL绝对URI具有以下通用格式:scheme:scheme-specific-part scheme-specific-part 取决于 scheme 。例如,ht...
Java网络教程 - Java网络UDP服务器以下代码显示了如何编写UDP回显服务器:DatagramSocket socket= new DatagramSocket(12345);Da...