失效链接处理 |
并发编程-volatile使用精讲 PDF 下载
本站整理下载:
相关截图:
主要内容:
1.1. 多线程下变量的不可见性
1.1.1 概述
在多线程并发执行下,多个线程修改共享的成员变量,会出现一个线程修改了共享变量的值后,另一个线程不能直接
看到该线程修改后的变量的最新值。
1.1.2 案例演示
public class MyThread extends Thread { // 定义成员变量 private boolean flag = false ; public boolean isFlag() { return flag;} @Override public void run() { try {Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); }// 将flag的值更改为true this.flag = true ; System.out.println("flag=" + flag); } }public class VolatileThreadDemo {// 测试类 public static void main(String[] args) { // 创建MyThread线程对象 Thread t = new MyThread() ; t.start(); // main方法 while(true) { if(t.isFlag()) { System.out.println("执行了======");
北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
1.1.3 执行结果
我们看到,子线程中已经将flag设置为true,但main()方法中始终没有读到修改后的最新值,从而循环没有能进入到
fi语句中执行,所以没有任何打印。
1.1.4 小结
多线程下修改共享变量会出现变量修改值后的不可见性。
1.2 变量不可见性内存语义
1.2.1 概述
在介绍多线程并发修改变量不可见现象的原因之前,我们需要了解回顾一下Java内存模型(和Java并发编程有关的模
型):JMM。
JMM(Java Memory Model):Java内存模型,是java虚拟机规范中所定义的一种内存模型,Java内存模型是标准化
的,屏蔽掉了底层不同计算机的区别。
Java内存模型(Java Memory Model)描述了Java程序中各种变量(线程共享变量)的访问规则,以及在JVM中将变量
存储到内存和从内存中读取变量这样的底层细节。
JMM有以下规定:
所有的共享变量都存储于主内存。这里所说的变量指的是实例变量和类变量。不包含局部变量,因为局部变量
是线程私有的,因此不存在竞争问题。
每一个线程还存在自己的工作内存,线程的工作内存,保留了被线程使用的变量的工作副本。
线程对变量的所有的操作(读,取)都必须在工作内存中完成,而不能直接读写主内存中的变量。
不同线程之间也不能直接访问对方工作内存中的变量,线程间变量的值的传递需要通过主内存中转来完成。
本地内存和主内存的关系:
|