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关键字与内存可见性介绍

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

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

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

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

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

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关键字与内存可见性介绍

6、此时查看程序运行结果:

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关键字与内存可见性介绍
  • 如何使用TypeScript定义类和方法并进行调用方法
  • RDP弱口令病毒怎么查杀呢?
  • WindowsMS12-020漏洞报告
  • 如何在windows10中禁用防火墙连接安全规则
  • Win7系统如何使用Tracert功能
  • 热门搜索
    除权除息日是什么意思 雏形的意思 富丽堂皇是什么意思 兵不厌诈的意思 妯娌是什么意思 势如破竹的意思 驴友是什么意思 recycle是什么意思 judy是什么意思 什么牌子的polo衫好