并发原子性分析
JVM字节码解析
-
例(a++)
-
源码
-
字节码反编译
- 需要先将a参数压入操作数栈顶
- 然后将int类型的1压入操作数栈顶
- 随后栈顶两个数相加 压入操作数栈顶
- 最后再赋值给a
原子性剖析
-
-
所以多个线程操作同一个数据的时候 因为JVM中底层不是原子性操作 所以会出现数据不能达到想定的问题
-
问题解决
-
锁
-
悲观锁
- 数据库行锁/表锁 synchronized
-
乐观锁
- MySQL中的MVCC JUC原子操作类 Redis中的watch/exec
-
Atomic(原子操作类)
-
synchronized关键字
-
用法
-
对象的内存布局
-
_klassOop部分:指向模板 当前对象的模板是谁 指向方法区的class对象
-
markOop(warkword)布局
-
-
变化
-
偏向锁 (可以配置JVM参数取消偏向锁)
-
轻量级锁
-
轻量级锁膨胀
-
重量级锁
- ObjectMonitor 对象监视器
-
-
-
-
-
wait方法 Owner----> Wait Set
-
notify、notifyAll方法 Wait Set ----> Entry List
-
wait方法和sleep方法区别
- sleep方法是让出CPU的执行权、依然占用对象锁
- wait方法是释放当前对象锁的内容