cas
cas是检查并替换。
原理: 两个线程同时访问主内存,这时主内存的共享变量是3,线程1拿取到3,但是这时开始GC,线程1挂起。这时线程2到来,线程二也在主内存中拿去到3,并对主内存的3进行修改,变成4。线程1这时结束挂起。再来主内存替换时,发现原值已经被替换。那么他会从头再来一次,拿取到4,进行操作。直到他拿到的值,在替换的时候和主内存的值相同时,才进行替换。只就是CAS原理
保证原子性
1.cas保证原子性,但是不能解决ABA的问题
2.Synchorized保证原子性: java还提供了lock和unlock来保证原子性,但是没有将lock和unlock直接开放给用户使用,但是提供了,更高级的字节码指令,monitorenter和monitorexit来隐式使用者两个操作。这两科执行在synchronized块之间操作具备原子性。
Synchronized保证三大特性(原子性,可见性,有序性)
1.synchronized 保证原子性的原理
对 number++;增加同步代码快,保证同一时间只有一个线程操作 number++;。就不会出现安全问题;
2.synchronized 保证可见性的原理,执行 synchronized时,会对应执行 lock 原子操作会刷新工作内存中共享变量的值;
3.as-if-serial语义的意思是:不管编译器和CPU如何重排序,必须保证单线程情况下程序的结果是正确的;