欢迎大家下载我个人开发的app安琪花园
1. 如何在多个线程间共享数据
用全局变量即可实现
2. 如何保证变量可见性
即在子线程里面能实时检测到外层的属性的变化
可能用Sycnizoned, volatile
涉及到相关的概念, java的内存模型
说白了就 是主内存 和工作内存机制, java内存模型产生的线程安全问题
也就 是产生了变量可见性的问题。简单的解决方案就是加同步关键字
那同步关键字是如何实现了变量可见性的问题。如何做到了线程安全
- 子内存里面修改后必须立马同步回主内存。
- 子内存读取数据的时候 从主内存重新读取一下
java 内存模型里面8种原子操作
lock 作用于主内存的变量,把一个变量标识为一条线程独占的状态
unlock 作用于主内存的变量,把一个处于锁定状态的变量释放出来。
read 把一个变量的值从主内存传输到工作内存中,以便随后的load使用。
load 把read操作从主内存中得到的变量值放入到工作内存的变量副本中。
use 把工作内存中一个变量的值传递给执行引擎,每当虚拟机遇到一个需要使用变量的值的字节码指令时将会执行这个操作。
assign 把一个从执行引擎中接收到的值赋值给工作内存中的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作。
store 把工作内存中的一个变量的值传递到主内存,以便随后的write使用。
write 把store操作从工作内存中得到的变量值放入到主内存的变量中。
synchronized 如何做到变量可见性的(而且是线程安全的)
- 进入同步块时先清空工作内存中的变量,从主内存重新加载
- 解锁前先同步回主内存
- 锁机制 只有获得锁了以后才能操作共享资源
volatile
- 能保证变量的可见性
- 不是线程安全的(更新数据后不是立马同步回主存的)
- 仅适用于变量
4、 标记的变量不会被编译器优化
网友评论