1.原子性:一个操作要么执行完,要么不执行。
2.可见性:线程修改数据以后,其他线程应该立马可见。
3.有序性(指令重排 影响多线程)
volatile的作用
1.当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值(保证可见性)。
2.保证一定的“有序性”
例如 volatile int i=10;
线程一: i++;-》》》》》取i,入栈,自增,出栈,写入主存
线程二:i++;
线程一,读取10并且入栈准备计算,中断,线程二运行修改i=11;(此时通知线程一无效,但是入栈了,线程一无反应)线程一继续运行得11写入 最终结果为11(错误!!!!)
内存间交互操作
lock 把变量标记为一个线程独占
unlock 解锁
read 从主存中读取数据到工作内存
load 把获取的变量值放入工作内存的变量副本中
use 把变量的值传递给执行引擎(入栈)
assign 作用于工作内存的变量,把从执行引擎获取的值赋给工作内存变量
store把变量值从工作内存传递给主存
write 作用于主存变量,把store传递的变量赋值给主存变量
hanppens-before规则
程序次序规则:一个线程内操作有序。
管程锁定规则:对于同一个锁,unlock先于lock
volatile规则:对于一个被修饰的变量,write先于read
线程启动规则:start()先行发生于此线程的每一个动作
线程终止规则:线程所有操作先行发生于对此线程的终止检测。join(),isAlive()
线程中断规则:对线程的interrupt()方法调用先行发生于被中断线程的代码检测到中断事件的发生
&