多语言展示
当前在线:145今日阅读:167今日分享:16

java8线程高级-volatile关键字与内存可见性介绍

java8线程高级-volatile关键字与内存可见性介绍
工具/原料
1

java8

2

intellij idea

方法/步骤
1

线程可见性测试:package com.gwolf;public class TestVolatile {    public static void main(String[] args) {        ThreadDemo threadDemo = new ThreadDemo();        new Thread(threadDemo).start();                while (true) {            if(threadDemo.isFlag()) {                System.out.println('-------------------');                break;            }        }    }}class ThreadDemo implements  Runnable {    private boolean flag = false;        @Override    public void run() {        try {            Thread.sleep(200);        } catch (InterruptedException e) {            e.printStackTrace();        }        flag = true;        System.out.print('flag = ' + isFlag());    }    public boolean isFlag() {        return flag;    }    public void setFlag(boolean flag) {        this.flag = flag;    }}

2

上面程序的输出会是一个什么样的结果:

3

程序结果说明主线程不能得到子线程中的值。原因是线程之间没有共享变量,每个线程有一块独立的内存空间

4

内存可见性问题是当多个线程操作共享数据时,批次不可见

5

使用同步锁解决,让程序去主存中读取数据package com.gwolf;public class TestVolatile {    public static void main(String[] args) {        ThreadDemo threadDemo = new ThreadDemo();        new Thread(threadDemo).start();                while (true) {            synchronized (threadDemo) {                if (threadDemo.isFlag()) {                    System.out.println('-------------------');                    break;                }            }        }            }}class ThreadDemo implements  Runnable {    private boolean flag = false;        @Override    public void run() {        try {            Thread.sleep(200);        } catch (InterruptedException e) {            e.printStackTrace();        }        flag = true;        System.out.print('flag = ' + isFlag());    }    public boolean isFlag() {        return flag;    }    public void setFlag(boolean flag) {        this.flag = flag;    }}

6

此时查看程序运行结果:

7

使用volatile关键字解决内存可见性问题,当多个线程进行共享数据时,可以保证内存中的数据可见package com.gwolf;public class TestVolatile {    public static void main(String[] args) {        ThreadDemo threadDemo = new ThreadDemo();        new Thread(threadDemo).start();                while (true) {            if (threadDemo.isFlag()) {                System.out.println('-------------------');                break;            }        }            }}class ThreadDemo implements  Runnable {    private volatile boolean flag = false;        @Override    public void run() {        try {            Thread.sleep(200);        } catch (InterruptedException e) {            e.printStackTrace();        }        flag = true;        System.out.print('flag = ' + isFlag());    }    public boolean isFlag() {        return flag;    }    public void setFlag(boolean flag) {        this.flag = flag;    }}

推荐信息