scynchonize

193 阅读2分钟
     * 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  关闭锁消除
     *
     */