* getstatic
* dup 复制
* astore_1 存储
* moniterenter 将lock对象markword置为monitor的指针
*
* aload_1
* moniterexit 将lock对象markword重置,唤醒entryList
*
*/
/**
* Java对象头
* 32位虚拟机
* 普通对象 (64 bits)
* klass word (32 bits) 指向对象的 类对象
* mark word (32 bits)
* hashcode :25
* age :4 分代年龄
* biased_lock:1 偏向锁
* state :2 加锁状态
* 数组对象(96 bits)
* mark word (32 bits)
* klass word (32 bits)
* array length(32 bits)
*
*
* Monitor
* owner 记录持有锁的线程
* entryList 没有获取到锁的线程,在此排队
* waitSet
*
*/
* 轻量级锁:如果一个对象虽然有多线程访问,但多线程访问的时间是错开的(也就是没有锁竞争),可以使用轻量级锁优化
*
* 32位虚拟机
* hashcode 25 age 4 biased 0 state 01 Normal
* thread 23 epoch 2 age 4 biased 1 state 01 Biased
* ptr_to_lock_record 30 state 00 Lightweight Locked
* ptr_to_heavyweight_monitor 30 state 10 Heavyweight Locked
* 11 Marked for GC
*
*轻量级锁(线程栈中的锁记录 lock record) :缺陷当放生锁重入的时候、还是会进行cas操作(偏向锁则不会进行cas操作)
* cas 修改mark word -> (lock record 地址 + 00)
*
* lock record 地址 -> mark word
*
* 锁膨胀
* cas修改mark word失败 (01 -> 00)
* 则升级为重量级锁(轻量级锁没有阻塞的概念;让当前线程进入阻塞状态)
*
* 自旋(只有多核cpu才有意义)
* 线程进入重量级锁,不会马上进入entryList;会重新尝试获取锁,如果持有锁的线程释放了锁,则当前线程可以避免阻塞
*
* 偏向锁
* 将线程id设置到锁对象的mark word(解锁时,不会清除线程id;故名偏向锁);减少锁重入时cas的消耗
* 如果开启了偏向锁,对象创建后,mark word 最后为101,但是不会在程序启动时立即生效(默认是延迟的)
* -XX:BiasedLockingStartupDelay=0可以禁止延迟
* -XX:-UseBiasedLocking 禁用偏向锁
* 偏向锁撤销
* 1.当一个可偏向的对象调用hashCode方法之后,就不可偏向了(因为mark word中要存放hashcode,没用空间存储线程id)
* 2.其他线程使用对象
* 3.调用wait/notify
* 批量重偏向
* 同一个类的对象,当撤销偏向锁阈值超过20次后,jvm会进行批量重偏向
* 同一个类的对象,当撤销偏向锁阈值超过40次后,jvm会批量撤销,以后这个类所有对象都会变为不可偏向的,新建对象也是不可偏向的
*
* 锁消除
* JIT即时编译器优化,当加锁的对象不可共享;jvm会将加锁代码优化为不加锁
* -XX:-EliminateLocks 关闭锁消除
*
*/