1、jmm(Java内存模型)
原子性、有序性、可见性;
2、在执行程序时为了提高性能,编译器和处理器会对指令做重排序,synchronized可禁止指令重排序,synchronized编译后会在相关位置前加入monitorenter,后加入monitorexit限制其他线程操作,从而保证原子性,同时在monitorexit之前会把共享数据刷回jmm的主内存保证可见性;
3、volatile:防止指令重排序,volatile保证内存可见性写的内存语义如下:
当写一个 volatile 变量时,JMM 会把该线程对应的本地内存中的共享变量值刷新到主内存。
volatile 读的内存语义如下:
当读一个 volatile 变量时,JMM 会把该线程对应的本地内存置为无效。线程接下来将从主内存中读取共享变量。
但不保证原子性;
4、final:被final修饰的字段在构造器中国一旦初始化完成,并且构造器没有把”this”的引用逃逸出去,那在其他线程中就能看见final字段的值。也就是final可保证可见性
volatile使用条件:
1、对变量的写入操作不依赖变量的当前值,或者只有单个线程更新变量的值;
2、该变量不会与其他状态变量一起纳入不变性条件
3、在访问变量时不需加锁
volatile关键字
最新推荐文章于 2021-10-11 21:12:04 发布