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

2024-10-15 06:00:04

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; }}

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

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

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

5、使用同步锁解决,让程序去主存中读取数据package com.gwolf;public clas衡痕贤伎s TestVolatile { pu芟鲠阻缒blic 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; }}

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

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; }}

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