volatile int
轻量级的同步机制
三大特性:保证可见性 || 不保证原子性(一个线程做 不能被加塞,同时成功/失败) || 禁止指令重排
要保证原子性 就 加 1.volatile 2.synchronize int() /// AtomicInteger .getAndIncrement
指令重排:
禁止指令重排,是加了内存屏障,CPU指令:1.保证执行顺序 其前后都不能换 2.保证可见性
volatile 写操作:storestore屏障 StoreLoad屏障
volatile 读操作:loadload屏障 loadStore屏障
他是一个规范,不是真实是存在的
java内存模型 规定所有的变量都在 主内存 是共享内存空间
jvm运行实体是线程,线程的工作内存是 私有数据区域
线程把 主内存的变量数据 拷贝到工作内存,完事 在放回主内存 更新上。
jmm的三个特性:1.可见性 || 2.原子性 || 3.有序性《相当于了禁止指令重排》
代码:
代码1 可见性:构造一个Thread让他sleep 并改了,main就拿不到改的
代码2 原子性:number++,开20个线程,每个添加1000回,最后不是20000个,,需要1.volatile int number 2. synchronize int() /// AtomicInteger .getAndIncrement
sychronized前判断instance==null,后也加上
他做的是 1.分配对象内存空间//2.初始化对象//3.instance指向分配的内存地址。
因为指令重排。
3.2 读写锁 手写缓存的时候
3.3 CAS底层也是
比较并交换Compare-And-Swap
CPU并发原语。是硬件的,就是原子性的。
自旋锁和unsafe类
rt.jar sun.misc.unsafe
CAS保证线程安全 靠的是 unsafe类
unsafe类里都是native方法,unsafe可以直接操作 特定内存数据
unsafe unsafe.getAndAddInt() 传一个内存偏移地址,里面有个do-while,根据jmm内存模型 直到工作内存跟主内存的值一样,才退出循环,,,自旋。
value用volatile修饰保证可见性。
AtomicInteger里面 是 UNsafe+CAS
AtomicInteger里面 是 UNsafe+CAS
compareAndSet
原文:https://www.cnblogs.com/ming-michelle/p/14587386.html