volatile 关键字的两层语义
java
一旦一个共享变量(类的成员变量、类的静态成员变量)被 volatile 修饰以后,那么就具有了两层语义:
1)保证了不一样线程对这个变量进行操做时的 可见性,即一个线程修改了某个变量的值,这新值对其余线程来讲是当即可见的。
2)禁止进行 指令重排序。
方式一:变量不使用 volatile 修饰ide
public class VolatileTest extends Thread { private static boolean flag = false; public void run() { while (!flag) ; } public static void main(String[] args) throws Exception { new VolatileTest().start(); Thread.sleep(2000); flag = true; } }
方式二:变量使用 volatile 修饰this
public class VolatileTest extends Thread { private static volatile boolean flag = false; public void run() { while (!flag) ; } public static void main(String[] args) throws Exception { new VolatileTest().start(); Thread.sleep(2000); flag = true; } }
运行结果
方式一:线程不会结束
线程
方式二:线程会结束
code
public class TestMain { public static volatile boolean flag = true; public static void main(String[] args) throws InterruptedException { new Thread(new Runnable() { @Override public void run() { while (flag) { } System.out.println(Thread.currentThread().getName() + "线程中止,死循环被打开"); } }).start(); new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } flag = false; System.out.println(Thread.currentThread().getName() + "修改 flag 为" + flag); } }).start(); Thread.sleep(Integer.MAX_VALUE); } }
public class RunThread extends Thread { /** volatile */ private volatile boolean isRunning = true; private void setRunning(boolean isRunning) { this.isRunning = isRunning; } public void run() { System.out.println("进入 run() 方法中..."); while (isRunning == true) { // doSomething() } System.out.println("线程结束了..."); } public static void main(String[] args) throws InterruptedException { RunThread myThread = new RunThread(); myThread.start(); Thread.sleep(3000); myThread.setRunning(false); System.out.println("isRunning 的值已经设置为了 false"); Thread.sleep(1000); System.out.println(myThread.isRunning); } }
public class RunThread extends Thread { /** volatile */ private boolean isRunning = true; private void setRunning(boolean isRunning) { this.isRunning = isRunning; } public void run() { System.out.println("进入 run() 方法中..."); while (isRunning == true) { // doSomething() } System.out.println("线程结束了..."); } public static void main(String[] args) throws InterruptedException { RunThread myThread = new RunThread(); myThread.start(); Thread.sleep(3000); myThread.setRunning(false); System.out.println("isRunning 的值已经设置为了 false"); Thread.sleep(1000); System.out.println(myThread.isRunning); } }