1.原子性(Atomicity)
定义:不可再分割的操作
Java内存模型直接保证原子性变量操作包括:read、load、assign、use、store 和 write 这6个
2.可见性(Visibility)
定义:是指当一个线程修改了一个共享变量的值时,其他线程能够立即的指这个修改
java内存模型是通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值这种依赖主内存作为媒介的方式实现可见性,
普通变量和volatile变量的区别:volatile的特殊规则保证了新值能立即同步到主内存
java保证可见性的的关键字:synchronized final valotile。
- volatile的特殊规则保证了新值能立即同步到主内存
- 同步块的可见性由“对一个变量执行unlock操作前”,必须把此变量同步回主内存中(执行store、write操作)
- final 字段在构造器中一旦被初始化完成,并且构造器没有把“this”的引用传递出去(this引用逃逸是一件很危险的事情,其他线程有可能通过这个引用方位到“初始化一般”的对象),那么在其他线程中就能看见final字段的值
3.有序性(Ordering)
如果本线程内观察,所有的操作都是有序的;如果一个线程中观察另外一个线程,所有的操作都是无序的。前半句是指“线程内似表现为串行的语义”(Wihtin-Thread As-If-Serila Semantics),后半句是指“指令重排序”现象和“工作内存与主内存同步延迟”现象
java通过sychronized和volatile两个关键字保证线程之间操作的有序性