线程安全:原子性,内存可见性,有序性。
缓存一致性问题:寄存器,高速缓存,主存,磁盘。主要是高速缓存到主存这一步各个CPU 同时操作主存中同一块数据所设计的问题
Volatile :java语言允许线程访问共享变量,为了确保能被准确和一致性更新,线程通过排它锁单独获取这个变量。次修饰符修饰的变量会在写操作变量的代码前缀加入锁指令,这个锁指令是机器级别的指令,不同的平台可能稍微不一致,但是语义是一样的。写完成会立即刷新到主存,并使其他缓存该数据的高速缓存失效,想要使用必须重新从主存读取。

对象头:64位操作系统会非数组类型占16个字节。前八个字节存放哈希码,锁类型,对象年龄。后八个字节存放到该对象所属类型数据的指针。对象的引用地址占八个字节吗?

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

原子性可以通过锁或者循环CAS 来实现。

CAS缺点:
1.ABA 问题。可以通过增加版本号解决
2.循环自旋非常耗费CPU 资源
3.只能保证一个共享变量的原子性。可以通过AtomicReference 类将多个变量封装起来保证引用类型的原子性。

各种锁的优缺点:

处理器的原子性实现:
通过对缓存加锁或者对总线加锁。对缓存加锁效率高!
Java实现原子性原理:
1.通过循环CAS来实现。CAS 是使用CPU 的系统命令。

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄