2.3.3volatile变量在多个线程间可见

来源:互联网 发布:淘宝产品搜索不到 编辑:程序博客网 时间:2024/06/06 12:40

volatile:注意作用是变量在多个线程间可见。举例说明。

package test;/** * Created by sunyifeng on 17/10/13. */public class RunThread extends Thread {    private boolean isRunning = true;    public boolean isRunning() {        return isRunning;    }    public void setRunning(boolean running) {        isRunning = running;    }    @Override    public void run() {        System.out.println("进入run方法");        while (isRunning == true) {            //            //System.out.println("进入while循环");        }        System.out.println("线程被停止了");    }}
package test;/** * Created by sunyifeng on 17/10/13. */public class Run {    public static void main(String[] args) throws  InterruptedException {            RunThread runThread = new RunThread();            runThread.start();            Thread.sleep(10); // main线程沉睡10毫秒            runThread.setRunning(false);            System.out.println("已经赋值为false");    }}
运行结果:

进入run方法
已经赋值为false

程序分析:

程序进入死循环,停不下来,前面我们已经做过实验,这种栗子,多线程是可以让程序停止的。本人的运行环境:MarBook-Pro(可以在JVM的运行参数中加-server)。原因是私有堆栈和共有堆栈中变量的值不一致造成的。更改程序,用volatile修饰变量:

volatile private boolean isRunning = true;
运行结果:

进入run方法
已经赋值为false
线程被停止了

分析程序:

通过使用volatile关键字,强制从公共内存堆栈中读取变量的值。

volatile和synchronized使用总结:

1、volatile只能修饰变量,不能修饰方法及代码块,是线程同步轻量级的实现;

2、volatile不会发生阻塞,synchronized会出现阻塞;

3、volatile不能保证数据原子性,synchronized能保证数据原子性。

阅读全文
0 0
原创粉丝点击