java8
intellij idea
线程可见性测试: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; }}
上面程序的输出会是一个什么样的结果:
程序结果说明主线程不能得到子线程中的值。原因是线程之间没有共享变量,每个线程有一块独立的内存空间
内存可见性问题是当多个线程操作共享数据时,批次不可见
使用同步锁解决,让程序去主存中读取数据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; }}
此时查看程序运行结果:
使用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; }}