四种内存屏障:
loadload:load1 loadload load2 该内存屏障使得load1对数据的装载操作先于load2以及后续的装载指令
loadstore:load1 loadstore store2 使得load1对数据的装载操作先于store2以及后续的存储指令
storestore:store1 storestore store2 使得store1对数据的存储先于store2以及后续的存储指令
storeload:store1 storeload load2 使得store1对数据的存储优先于后续的装载指令,是一个全能性的指令,要求该屏障之前的所有操作都完成之后才能进行后续的操作
volatile:在每个volatile写操作之前插入一个storestore指令
在每个volatile写操作之后插入一个storeload指令
在每个volatile读之后插入一个loadload
在每个volatile读之后插入一个loadstore
happens-before原则:
程序次序原则
监视器锁规则:对一个锁的解锁,happens-before随后对这个锁的加锁
volatile规则:对一个volatile变量的写happens-before随后对这个变量的读取
传递规则:
其他规则:如线程start,interrupt等
volatile内存语义:(1)可见性:对一个变量的读,总是能看到任意线程对这个变量最后的写入(2)禁止指令重排序:对volatile读写插入内存屏障禁止重排序。
synchronized内存语义:(1)实现线程间互斥执行:在同一个锁的临界区内的代码互斥执行(2)确保内存可见性:释放锁之前会将同步代码中写变量刷新到主内存,在获取锁时会将工作内存中的变量设为无效,必须从主内存中重新获取
final内存语义:(1)在对象引用为任意线程可见之前,对象的final域已经被正确初始化(2)读对象引用需要在读final域之前
loadload:load1 loadload load2 该内存屏障使得load1对数据的装载操作先于load2以及后续的装载指令
loadstore:load1 loadstore store2 使得load1对数据的装载操作先于store2以及后续的存储指令
storestore:store1 storestore store2 使得store1对数据的存储先于store2以及后续的存储指令
storeload:store1 storeload load2 使得store1对数据的存储优先于后续的装载指令,是一个全能性的指令,要求该屏障之前的所有操作都完成之后才能进行后续的操作
volatile:在每个volatile写操作之前插入一个storestore指令
在每个volatile写操作之后插入一个storeload指令
在每个volatile读之后插入一个loadload
在每个volatile读之后插入一个loadstore
happens-before原则:
程序次序原则
监视器锁规则:对一个锁的解锁,happens-before随后对这个锁的加锁
volatile规则:对一个volatile变量的写happens-before随后对这个变量的读取
传递规则:
其他规则:如线程start,interrupt等
volatile内存语义:(1)可见性:对一个变量的读,总是能看到任意线程对这个变量最后的写入(2)禁止指令重排序:对volatile读写插入内存屏障禁止重排序。
synchronized内存语义:(1)实现线程间互斥执行:在同一个锁的临界区内的代码互斥执行(2)确保内存可见性:释放锁之前会将同步代码中写变量刷新到主内存,在获取锁时会将工作内存中的变量设为无效,必须从主内存中重新获取
final内存语义:(1)在对象引用为任意线程可见之前,对象的final域已经被正确初始化(2)读对象引用需要在读final域之前