并发编程-锁膨胀

并发编程之锁膨胀

前言:记录一下并发编程的学习,做个笔记加深印象。并发编程学习的路神的视频。

锁膨胀是针对很对场景而言的,下面主要记录一些常见场景,然后最后总结一下。

一、第一次加锁

第一次加锁,走匿名偏向锁的流程,产生一个偏向自己的mark,然后调用cas替换头对象,成功则加锁,失败则撤销偏向并且升级轻量级锁。

二、第二次偏向加锁

2.1 t1把锁释放,t1又来加锁

/**
    t1再次加锁
*/
synchronized(header){
}
synchronized(header){
}


/**
    锁重入
*/
synchronized(header){
    synchronized(header){
    }
}

对于同一个线程重新加锁,首先会有一个锁对象,比如l,然后会在当前线程栈中创建一个lockrecord,然后判断当前线程是否是自己,是否过期(通过epoch标志判断),不考虑过期,那么当前线程直接拿到锁,这就是最简单的偏向锁获取过程。

总结:偏向锁第二次、第三次、第四次...获取锁的流程:首先会在线程栈中创建一个锁记录,这个锁记录的主要作用是来记录锁重入,创建完锁记录,判断当前持有锁的线程是否是自己,是否过期,如果是自己,则拿到锁,进入同步代码块,不需要CAS,所以性能最好。

2.2 t1释放锁,t2来加锁

现在的场景是t1执行完了,释放了锁(偏向锁),t2来加锁,根据经验可知t2要升级为轻量级锁,t2的升级需要做偏向撤销(下面会有讲什么是偏向撤销),t2如果加锁成功则如下图所示:

t2执行完把锁记录释放,并且恢复所对象中的markword,那么t2执行完同步块中的代码后的内存如下图所示:

三、轻量级锁膨胀为重量级锁

简单说就是在并发情况下,线程间发生了资源竞争,轻量级锁就会膨胀为重量级锁。比如:线程t4在线程t3还没有执行CAS的时候,发生了时间片轮换,它把锁持有了改成了00,并且做完了t3该做的事情;那么t3执行CAS失败。因为CAS是判断当前对象头中的markword是不是和t3在cpu内存中产生的markword相等,由于t3产生的是一个无锁的001,而对象头现在被t4改为了轻量级锁(000),所以就会失败,发生锁膨胀。

四、批量重偏向(发生阈值=20次)

先看一段代码:

@Slf4j(topic = "enjoy")
public class TestInflate {
    static Thread t2;
    static Thread t3;
    static Thread t1;
    static int loopFlag = 19;

    public static void main(String[] args) throws InterruptedException {
        //101  可偏向 没有线程偏向

        //a 没有线程偏向---匿名    101偏向锁
        List<A> list = new ArrayList<>();

        t1 = new Thread() {
            @Override
            public void run() {
                for (int i = 0; i < loopFlag; i++) {
                    A a = new A();
                    list.add(a);
                    synchronized (a) {
                        log.debug(i + " " + ClassLayout.parseInstance(a).toPrintableTest(a));
                    }
                }

                log.debug("============t1执行完毕=============");
                LockSupport.unpark(t2);
            }


        };

        t2 = new Thread() {
            LockSupport.park();
                for (int i = 0; i < loopFlag; i++) {
                    A a = list.get(i);
                    //打印结果为101 因为是从list取出的都是偏向t1的,所以是偏向锁101
                    log.debug( i + " 101首先 before" + " " + ClassLayout.parseInstance(a).toPrintableTest(a));
                    synchronized (a) {
                        //打印结果为000 前20条撤销偏向t1,然后撤销偏向升级轻量级锁指向t2线程栈当中的锁记录
                        //20条后面的则会发生批量偏向t2
                        log.debug( i + " 前20都是 000 ing" + " " + ClassLayout.parseInstance(a).toPrintableTest(a));
                    }
                    //因为前20条是轻量级锁,释放之后为无锁不可偏向
                    //但是后面的是偏向t2,释放之后依然是偏向t2
                    log.debug( i + " 前20都是001 after" + " " + ClassLayout.parseInstance(a).toPrintableTest(a));
                }
            }
        };

        t1.start();
        t2.start();

//默认产生的对象应该101
        log.debug(ClassLayout.parseInstance(new A()).toPrintable());
    }
}
/**
------------------打印结果-------------------------
15:16:56.572 [Thread-0] DEBUG enjoy - 0 00000101
15:16:56.572 [Thread-0] DEBUG enjoy - 1 00000101
15:16:56.572 [Thread-0] DEBUG enjoy - 2 00000101
15:16:56.572 [Thread-0] DEBUG enjoy - 3 00000101
15:16:56.573 [Thread-0] DEBUG enjoy - 4 00000101
15:16:56.573 [Thread-0] DEBUG enjoy - 5 00000101
15:16:56.573 [Thread-0] DEBUG enjoy - 6 00000101
15:16:56.573 [Thread-0] DEBUG enjoy - 7 00000101
15:16:56.574 [Thread-0] DEBUG enjoy - 8 00000101
15:16:56.574 [Thread-0] DEBUG enjoy - 9 00000101
15:16:56.574 [Thread-0] DEBUG enjoy - 10 00000101
15:16:56.574 [Thread-0] DEBUG enjoy - 11 00000101
15:16:56.575 [Thread-0] DEBUG enjoy - 12 00000101
15:16:56.575 [Thread-0] DEBUG enjoy - 13 00000101
15:16:56.575 [Thread-0] DEBUG enjoy - 14 00000101
15:16:56.575 [Thread-0] DEBUG enjoy - 15 00000101
15:16:56.576 [Thread-0] DEBUG enjoy - 16 00000101
15:16:56.576 [Thread-0] DEBUG enjoy - 17 00000101
15:16:56.576 [Thread-0] DEBUG enjoy - 18 00000101
15:16:56.576 [Thread-0] DEBUG enjoy - ============t1执行完毕=============
15:16:56.577 [Thread-1] DEBUG enjoy - 0 101首先 before 00000101
15:16:56.577 [Thread-1] DEBUG enjoy - 0 前20都是 000 ing 10101000
15:16:56.578 [Thread-1] DEBUG enjoy - 0 前20都是001 after 00000001
15:16:56.578 [Thread-1] DEBUG enjoy - 1 101首先 before 00000101
15:16:56.578 [Thread-1] DEBUG enjoy - 1 前20都是 000 ing 10101000
15:16:56.579 [Thread-1] DEBUG enjoy - 1 前20都是001 after 00000001
15:16:56.579 [Thread-1] DEBUG enjoy - 2 101首先 before 00000101
15:16:56.579 [Thread-1] DEBUG enjoy - 2 前20都是 000 ing 10101000
15:16:56.580 [Thread-1] DEBUG enjoy - 2 前20都是001 after 00000001
15:16:56.580 [Thread-1] DEBUG enjoy - 3 101首先 before 00000101
15:16:56.580 [Thread-1] DEBUG enjoy - 3 前20都是 000 ing 10101000
15:16:56.580 [Thread-1] DEBUG enjoy - 3 前20都是001 after 00000001
15:16:56.580 [Thread-1] DEBUG enjoy - 4 101首先 before 00000101
15:16:56.581 [Thread-1] DEBUG enjoy - 4 前20都是 000 ing 10101000
15:16:56.581 [Thread-1] DEBUG enjoy - 4 前20都是001 after 00000001
15:16:56.581 [Thread-1] DEBUG enjoy - 5 101首先 before 00000101
15:16:56.581 [Thread-1] DEBUG enjoy - 5 前20都是 000 ing 10101000
15:16:56.581 [Thread-1] DEBUG enjoy - 5 前20都是001 after 00000001
15:16:56.581 [Thread-1] DEBUG enjoy - 6 101首先 before 00000101
15:16:56.582 [Thread-1] DEBUG enjoy - 6 前20都是 000 ing 10101000
15:16:56.582 [Thread-1] DEBUG enjoy - 6 前20都是001 after 00000001
15:16:56.582 [Thread-1] DEBUG enjoy - 7 101首先 before 00000101
15:16:56.582 [Thread-1] DEBUG enjoy - 7 前20都是 000 ing 10101000
15:16:56.582 [Thread-1] DEBUG enjoy - 7 前20都是001 after 00000001
15:16:56.582 [Thread-1] DEBUG enjoy - 8 101首先 before 00000101
15:16:56.583 [Thread-1] DEBUG enjoy - 8 前20都是 000 ing 10101000
15:16:56.583 [Thread-1] DEBUG enjoy - 8 前20都是001 after 00000001
15:16:56.583 [Thread-1] DEBUG enjoy - 9 101首先 before 00000101
15:16:56.583 [Thread-1] DEBUG enjoy - 9 前20都是 000 ing 10101000
15:16:56.583 [Thread-1] DEBUG enjoy - 9 前20都是001 after 00000001
15:16:56.583 [Thread-1] DEBUG enjoy - 10 101首先 before 00000101
15:16:56.584 [Thread-1] DEBUG enjoy - 10 前20都是 000 ing 10101000
15:16:56.584 [Thread-1] DEBUG enjoy - 10 前20都是001 after 00000001
15:16:56.584 [Thread-1] DEBUG enjoy - 11 101首先 before 00000101
15:16:56.584 [Thread-1] DEBUG enjoy - 11 前20都是 000 ing 10101000
15:16:56.584 [Thread-1] DEBUG enjoy - 11 前20都是001 after 00000001
15:16:56.584 [Thread-1] DEBUG enjoy - 12 101首先 before 00000101
15:16:56.584 [Thread-1] DEBUG enjoy - 12 前20都是 000 ing 10101000
15:16:56.585 [Thread-1] DEBUG enjoy - 12 前20都是001 after 00000001
15:16:56.585 [Thread-1] DEBUG enjoy - 13 101首先 before 00000101
15:16:56.585 [Thread-1] DEBUG enjoy - 13 前20都是 000 ing 10101000
15:16:56.585 [Thread-1] DEBUG enjoy - 13 前20都是001 after 00000001
15:16:56.585 [Thread-1] DEBUG enjoy - 14 101首先 before 00000101
15:16:56.586 [Thread-1] DEBUG enjoy - 14 前20都是 000 ing 10101000
15:16:56.586 [Thread-1] DEBUG enjoy - 14 前20都是001 after 00000001
15:16:56.586 [Thread-1] DEBUG enjoy - 15 101首先 before 00000101
15:16:56.586 [Thread-1] DEBUG enjoy - 15 前20都是 000 ing 10101000
15:16:56.586 [Thread-1] DEBUG enjoy - 15 前20都是001 after 00000001
15:16:56.586 [Thread-1] DEBUG enjoy - 16 101首先 before 00000101
15:16:56.586 [Thread-1] DEBUG enjoy - 16 前20都是 000 ing 10101000
15:16:56.586 [Thread-1] DEBUG enjoy - 16 前20都是001 after 00000001
15:16:56.587 [Thread-1] DEBUG enjoy - 17 101首先 before 00000101
15:16:56.587 [Thread-1] DEBUG enjoy - 17 前20都是 000 ing 10101000
15:16:56.587 [Thread-1] DEBUG enjoy - 17 前20都是001 after 00000001
15:16:56.587 [Thread-1] DEBUG enjoy - 18 101首先 before 00000101
15:16:56.587 [Thread-1] DEBUG enjoy - 18 前20都是 000 ing 10101000
15:16:56.587 [Thread-1] DEBUG enjoy - 18 前20都是001 after 00000001

Process finished with exit code 0

*/

分析上面代码:t1创建的是19条偏向锁101,当t1释放锁之后,原先偏向t1的锁,仍然可以偏向t2,重新偏向会重置对象头的线程id。当撤销偏向锁阈值超过20次后,jvm就会触发批量重偏向(也可以理解为锁的降级)。

将上面代码的 loopFlag 调整为 loopFlag = 30,分析下面打印结果,发现从第20次(从0开始的,所以结果中是19开始)开始 before、ing和after都变成了101。即从20次(从0开始的,所以结果中是19开始)之后就发生了批量重偏向。

log.debug(ClassLayout.parseInstance(new A()).toPrintable());//此时打印的对象头是 101为偏向锁。 重点关注一下这个打印结果,需要和下面发生批量撤销区别

15:37:05.211 [Thread-0] DEBUG enjoy - 0 00000101
15:37:05.213 [Thread-0] DEBUG enjoy - 1 00000101
15:37:05.214 [Thread-0] DEBUG enjoy - 2 00000101
15:37:05.214 [Thread-0] DEBUG enjoy - 3 00000101
15:37:05.215 [Thread-0] DEBUG enjoy - 4 00000101
15:37:05.215 [Thread-0] DEBUG enjoy - 5 00000101
15:37:05.216 [Thread-0] DEBUG enjoy - 6 00000101
15:37:05.216 [Thread-0] DEBUG enjoy - 7 00000101
15:37:05.217 [Thread-0] DEBUG enjoy - 8 00000101
15:37:05.217 [Thread-0] DEBUG enjoy - 9 00000101
15:37:05.217 [Thread-0] DEBUG enjoy - 10 00000101
15:37:05.218 [Thread-0] DEBUG enjoy - 11 00000101
15:37:05.218 [Thread-0] DEBUG enjoy - 12 00000101
15:37:05.218 [Thread-0] DEBUG enjoy - 13 00000101
15:37:05.219 [Thread-0] DEBUG enjoy - 14 00000101
15:37:05.219 [Thread-0] DEBUG enjoy - 15 00000101
15:37:05.219 [Thread-0] DEBUG enjoy - 16 00000101
15:37:05.220 [Thread-0] DEBUG enjoy - 17 00000101
15:37:05.220 [Thread-0] DEBUG enjoy - 18 00000101
15:37:05.220 [Thread-0] DEBUG enjoy - 19 00000101
15:37:05.220 [Thread-0] DEBUG enjoy - 20 00000101
15:37:05.221 [Thread-0] DEBUG enjoy - 21 00000101
15:37:05.221 [Thread-0] DEBUG enjoy - 22 00000101
15:37:05.221 [Thread-0] DEBUG enjoy - 23 00000101
15:37:05.222 [Thread-0] DEBUG enjoy - 24 00000101
15:37:05.222 [Thread-0] DEBUG enjoy - 25 00000101
15:37:05.222 [Thread-0] DEBUG enjoy - 26 00000101
15:37:05.222 [Thread-0] DEBUG enjoy - 27 00000101
15:37:05.223 [Thread-0] DEBUG enjoy - 28 00000101
15:37:05.223 [Thread-0] DEBUG enjoy - 29 00000101
15:37:05.223 [Thread-0] DEBUG enjoy - ============t1执行完毕=============
15:37:05.223 [Thread-1] DEBUG enjoy - 0 101首先 before 00000101
15:37:05.224 [Thread-1] DEBUG enjoy - 0 前20都是 000 ing 10101000
15:37:05.224 [Thread-1] DEBUG enjoy - 0 前20都是001 after 00000001
15:37:05.224 [Thread-1] DEBUG enjoy - 1 101首先 before 00000101
15:37:05.225 [Thread-1] DEBUG enjoy - 1 前20都是 000 ing 10101000
15:37:05.225 [Thread-1] DEBUG enjoy - 1 前20都是001 after 00000001
15:37:05.225 [Thread-1] DEBUG enjoy - 2 101首先 before 00000101
15:37:05.226 [Thread-1] DEBUG enjoy - 2 前20都是 000 ing 10101000
15:37:05.226 [Thread-1] DEBUG enjoy - 2 前20都是001 after 00000001
15:37:05.226 [Thread-1] DEBUG enjoy - 3 101首先 before 00000101
15:37:05.226 [Thread-1] DEBUG enjoy - 3 前20都是 000 ing 10101000
15:37:05.227 [Thread-1] DEBUG enjoy - 3 前20都是001 after 00000001
15:37:05.227 [Thread-1] DEBUG enjoy - 4 101首先 before 00000101
15:37:05.227 [Thread-1] DEBUG enjoy - 4 前20都是 000 ing 10101000
15:37:05.227 [Thread-1] DEBUG enjoy - 4 前20都是001 after 00000001
15:37:05.228 [Thread-1] DEBUG enjoy - 5 101首先 before 00000101
15:37:05.228 [Thread-1] DEBUG enjoy - 5 前20都是 000 ing 10101000
15:37:05.228 [Thread-1] DEBUG enjoy - 5 前20都是001 after 00000001
15:37:05.228 [Thread-1] DEBUG enjoy - 6 101首先 before 00000101
15:37:05.228 [Thread-1] DEBUG enjoy - 6 前20都是 000 ing 10101000
15:37:05.229 [Thread-1] DEBUG enjoy - 6 前20都是001 after 00000001
15:37:05.229 [Thread-1] DEBUG enjoy - 7 101首先 before 00000101
15:37:05.229 [Thread-1] DEBUG enjoy - 7 前20都是 000 ing 10101000
15:37:05.229 [Thread-1] DEBUG enjoy - 7 前20都是001 after 00000001
15:37:05.229 [Thread-1] DEBUG enjoy - 8 101首先 before 00000101
15:37:05.230 [Thread-1] DEBUG enjoy - 8 前20都是 000 ing 10101000
15:37:05.230 [Thread-1] DEBUG enjoy - 8 前20都是001 after 00000001
15:37:05.230 [Thread-1] DEBUG enjoy - 9 101首先 before 00000101
15:37:05.231 [Thread-1] DEBUG enjoy - 9 前20都是 000 ing 10101000
15:37:05.231 [Thread-1] DEBUG enjoy - 9 前20都是001 after 00000001
15:37:05.231 [Thread-1] DEBUG enjoy - 10 101首先 before 00000101
15:37:05.231 [Thread-1] DEBUG enjoy - 10 前20都是 000 ing 10101000
15:37:05.231 [Thread-1] DEBUG enjoy - 10 前20都是001 after 00000001
15:37:05.231 [Thread-1] DEBUG enjoy - 11 101首先 before 00000101
15:37:05.232 [Thread-1] DEBUG enjoy - 11 前20都是 000 ing 10101000
15:37:05.232 [Thread-1] DEBUG enjoy - 11 前20都是001 after 00000001
15:37:05.232 [Thread-1] DEBUG enjoy - 12 101首先 before 00000101
15:37:05.232 [Thread-1] DEBUG enjoy - 12 前20都是 000 ing 10101000
15:37:05.233 [Thread-1] DEBUG enjoy - 12 前20都是001 after 00000001
15:37:05.233 [Thread-1] DEBUG enjoy - 13 101首先 before 00000101
15:37:05.233 [Thread-1] DEBUG enjoy - 13 前20都是 000 ing 10101000
15:37:05.233 [Thread-1] DEBUG enjoy - 13 前20都是001 after 00000001
15:37:05.233 [Thread-1] DEBUG enjoy - 14 101首先 before 00000101
15:37:05.234 [Thread-1] DEBUG enjoy - 14 前20都是 000 ing 10101000
15:37:05.234 [Thread-1] DEBUG enjoy - 14 前20都是001 after 00000001
15:37:05.237 [Thread-1] DEBUG enjoy - 15 101首先 before 00000101
15:37:05.237 [Thread-1] DEBUG enjoy - 15 前20都是 000 ing 10101000
15:37:05.237 [Thread-1] DEBUG enjoy - 15 前20都是001 after 00000001
15:37:05.238 [Thread-1] DEBUG enjoy - 16 101首先 before 00000101
15:37:05.238 [Thread-1] DEBUG enjoy - 16 前20都是 000 ing 10101000
15:37:05.238 [Thread-1] DEBUG enjoy - 16 前20都是001 after 00000001
15:37:05.238 [Thread-1] DEBUG enjoy - 17 101首先 before 00000101
15:37:05.239 [Thread-1] DEBUG enjoy - 17 前20都是 000 ing 10101000
15:37:05.239 [Thread-1] DEBUG enjoy - 17 前20都是001 after 00000001
15:37:05.239 [Thread-1] DEBUG enjoy - 18 101首先 before 00000101
15:37:05.239 [Thread-1] DEBUG enjoy - 18 前20都是 000 ing 10101000
15:37:05.240 [Thread-1] DEBUG enjoy - 18 前20都是001 after 00000001
15:37:05.240 [Thread-1] DEBUG enjoy - 19 101首先 before 00000101
15:37:05.240 [Thread-1] DEBUG enjoy - 19 前20都是 000 ing 00000101
15:37:05.240 [Thread-1] DEBUG enjoy - 19 前20都是001 after 00000101
15:37:05.240 [Thread-1] DEBUG enjoy - 20 101首先 before 00000101
15:37:05.241 [Thread-1] DEBUG enjoy - 20 前20都是 000 ing 00000101
15:37:05.241 [Thread-1] DEBUG enjoy - 20 前20都是001 after 00000101
15:37:05.241 [Thread-1] DEBUG enjoy - 21 101首先 before 00000101
15:37:05.241 [Thread-1] DEBUG enjoy - 21 前20都是 000 ing 00000101
15:37:05.241 [Thread-1] DEBUG enjoy - 21 前20都是001 after 00000101
15:37:05.241 [Thread-1] DEBUG enjoy - 22 101首先 before 00000101
15:37:05.242 [Thread-1] DEBUG enjoy - 22 前20都是 000 ing 00000101
15:37:05.242 [Thread-1] DEBUG enjoy - 22 前20都是001 after 00000101
15:37:05.242 [Thread-1] DEBUG enjoy - 23 101首先 before 00000101
15:37:05.242 [Thread-1] DEBUG enjoy - 23 前20都是 000 ing 00000101
15:37:05.242 [Thread-1] DEBUG enjoy - 23 前20都是001 after 00000101
15:37:05.243 [Thread-1] DEBUG enjoy - 24 101首先 before 00000101
15:37:05.243 [Thread-1] DEBUG enjoy - 24 前20都是 000 ing 00000101
15:37:05.243 [Thread-1] DEBUG enjoy - 24 前20都是001 after 00000101
15:37:05.243 [Thread-1] DEBUG enjoy - 25 101首先 before 00000101
15:37:05.243 [Thread-1] DEBUG enjoy - 25 前20都是 000 ing 00000101
15:37:05.243 [Thread-1] DEBUG enjoy - 25 前20都是001 after 00000101
15:37:05.244 [Thread-1] DEBUG enjoy - 26 101首先 before 00000101
15:37:05.244 [Thread-1] DEBUG enjoy - 26 前20都是 000 ing 00000101
15:37:05.244 [Thread-1] DEBUG enjoy - 26 前20都是001 after 00000101
15:37:05.244 [Thread-1] DEBUG enjoy - 27 101首先 before 00000101
15:37:05.244 [Thread-1] DEBUG enjoy - 27 前20都是 000 ing 00000101
15:37:05.244 [Thread-1] DEBUG enjoy - 27 前20都是001 after 00000101
15:37:05.244 [Thread-1] DEBUG enjoy - 28 101首先 before 00000101
15:37:05.245 [Thread-1] DEBUG enjoy - 28 前20都是 000 ing 00000101
15:37:05.245 [Thread-1] DEBUG enjoy - 28 前20都是001 after 00000101
15:37:05.245 [Thread-1] DEBUG enjoy - 29 101首先 before 00000101
15:37:05.245 [Thread-1] DEBUG enjoy - 29 前20都是 000 ing 00000101
15:37:05.245 [Thread-1] DEBUG enjoy - 29 前20都是001 after 00000101
# WARNING: Unable to attach Serviceability Agent. You can try again with escalated privileges. Two options: a) use -Djol.tryWithSudo=true to try with sudo; b) echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
15:37:05.340 [main] DEBUG enjoy - com.liheng.A object internals:
 OFFSET  SIZE      TYPE DESCRIPTION                               VALUE
      0     4           (object header)                           05 00 00 00 (00000101 00000000 00000000 00000000) (5)
      4     4           (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4           (object header)                           6a 8b 01 f8 (01101010 10001011 00000001 11111000) (-134116502)
     12     1   boolean A.f                                       false
     13     3           (alignment/padding gap)                  
     16     4    byte[] A.aByte                                   [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
     20     4           (loss due to the next object alignment)
Instance size: 24 bytes
Space losses: 3 bytes internal + 4 bytes external = 7 bytes total


Process finished with exit code 0

五、批量撤销(阈值=40次)

先看段代码:

@Slf4j(topic = "enjoy")
public class TestInflate {
    static Thread t2;
    static Thread t3;
    static Thread t1;
    static int loopFlag = 40;

    public static void main(String[] args) throws InterruptedException {
        //101  可偏向 没有线程偏向

        //a 没有线程偏向---匿名    101偏向锁
        List<A> list = new ArrayList<>();

        t1 = new Thread() {
            @Override
            public void run() {
                for (int i = 0; i < loopFlag; i++) {
                    A a = new A();
                    list.add(a);
                    synchronized (a) {
                        log.debug(i + " " + ClassLayout.parseInstance(a).toPrintableTest(a));
                    }
                }

                log.debug("============t1执行完毕=============");
                LockSupport.unpark(t2);
            }


        };

        t2 = new Thread() {

            @Override
            public void run() {
                LockSupport.park();
                for (int i = 0; i < loopFlag; i++) {
                    A a = list.get(i);
                    //打印结果为101 因为是从list取出的都是偏向t1的,所以是偏向锁101
                    log.debug(i + " 101首先 before" + " " + ClassLayout.parseInstance(a).toPrintableTest(a));
                    synchronized (a) {
                        //打印结果为000 前20条撤销偏向t1,然后撤销偏向升级轻量级锁指向t2线程栈当中的锁记录
                        //20条后面的则会发生批量偏向t2
                        log.debug(i + " 前20都是 000 ing" + " " + ClassLayout.parseInstance(a).toPrintableTest(a));
                    }
                    //因为前20条是轻量级锁,释放之后为无锁不可偏向
                    //但是后面的是偏向t2,释放之后依然是偏向t2
                    log.debug(i + " 前20都是001 after" + " " + ClassLayout.parseInstance(a).toPrintableTest(a));
                }

                log.debug("======t3=====================================");
                LockSupport.unpark(t3);

            }
        };


        t3 = new Thread() {
            @Override
            public void run() {
                LockSupport.park();
                for (int i = 0; i < loopFlag; i++) {
                    A a = list.get(i);
                    log.debug(i + " " + ClassLayout.parseInstance(a).toPrintableTest(a));
                    synchronized (a) {
                        log.debug(i + " " + ClassLayout.parseInstance(a).toPrintableTest(a));
                    }
                    log.debug(i + " " + ClassLayout.parseInstance(a).toPrintableTest(a));
                }
            }
        };

        t1.start();
        t2.start();
        t3.start();
        t3.join();

        Thread.sleep(500);
        log.debug(ClassLayout.parseInstance(new A()).toPrintable());
    }
}
/**
--------------------打印结果--------------------
16:32:13.535 [Thread-0] DEBUG enjoy - 0 00000101
16:32:13.537 [Thread-0] DEBUG enjoy - 1 00000101
16:32:13.537 [Thread-0] DEBUG enjoy - 2 00000101
16:32:13.538 [Thread-0] DEBUG enjoy - 3 00000101
16:32:13.538 [Thread-0] DEBUG enjoy - 4 00000101
16:32:13.538 [Thread-0] DEBUG enjoy - 5 00000101
16:32:13.538 [Thread-0] DEBUG enjoy - 6 00000101
16:32:13.539 [Thread-0] DEBUG enjoy - 7 00000101
16:32:13.539 [Thread-0] DEBUG enjoy - 8 00000101
16:32:13.539 [Thread-0] DEBUG enjoy - 9 00000101
16:32:13.540 [Thread-0] DEBUG enjoy - 10 00000101
16:32:13.540 [Thread-0] DEBUG enjoy - 11 00000101
16:32:13.540 [Thread-0] DEBUG enjoy - 12 00000101
16:32:13.540 [Thread-0] DEBUG enjoy - 13 00000101
16:32:13.540 [Thread-0] DEBUG enjoy - 14 00000101
16:32:13.541 [Thread-0] DEBUG enjoy - 15 00000101
16:32:13.541 [Thread-0] DEBUG enjoy - 16 00000101
16:32:13.541 [Thread-0] DEBUG enjoy - 17 00000101
16:32:13.541 [Thread-0] DEBUG enjoy - 18 00000101
16:32:13.541 [Thread-0] DEBUG enjoy - 19 00000101
16:32:13.541 [Thread-0] DEBUG enjoy - 20 00000101
16:32:13.542 [Thread-0] DEBUG enjoy - 21 00000101
16:32:13.542 [Thread-0] DEBUG enjoy - 22 00000101
16:32:13.542 [Thread-0] DEBUG enjoy - 23 00000101
16:32:13.542 [Thread-0] DEBUG enjoy - 24 00000101
16:32:13.542 [Thread-0] DEBUG enjoy - 25 00000101
16:32:13.542 [Thread-0] DEBUG enjoy - 26 00000101
16:32:13.543 [Thread-0] DEBUG enjoy - 27 00000101
16:32:13.543 [Thread-0] DEBUG enjoy - 28 00000101
16:32:13.543 [Thread-0] DEBUG enjoy - 29 00000101
16:32:13.543 [Thread-0] DEBUG enjoy - 30 00000101
16:32:13.543 [Thread-0] DEBUG enjoy - 31 00000101
16:32:13.543 [Thread-0] DEBUG enjoy - 32 00000101
16:32:13.543 [Thread-0] DEBUG enjoy - 33 00000101
16:32:13.544 [Thread-0] DEBUG enjoy - 34 00000101
16:32:13.544 [Thread-0] DEBUG enjoy - 35 00000101
16:32:13.544 [Thread-0] DEBUG enjoy - 36 00000101
16:32:13.544 [Thread-0] DEBUG enjoy - 37 00000101
16:32:13.544 [Thread-0] DEBUG enjoy - 38 00000101
16:32:13.544 [Thread-0] DEBUG enjoy - 39 00000101
16:32:13.544 [Thread-0] DEBUG enjoy - ============t1执行完毕=============
16:32:13.545 [Thread-1] DEBUG enjoy - 0 101首先 before 00000101
16:32:13.545 [Thread-1] DEBUG enjoy - 0 前20都是 000 ing 10101000
16:32:13.545 [Thread-1] DEBUG enjoy - 0 前20都是001 after 00000001
16:32:13.546 [Thread-1] DEBUG enjoy - 1 101首先 before 00000101
16:32:13.546 [Thread-1] DEBUG enjoy - 1 前20都是 000 ing 10101000
16:32:13.546 [Thread-1] DEBUG enjoy - 1 前20都是001 after 00000001
16:32:13.546 [Thread-1] DEBUG enjoy - 2 101首先 before 00000101
16:32:13.546 [Thread-1] DEBUG enjoy - 2 前20都是 000 ing 10101000
16:32:13.546 [Thread-1] DEBUG enjoy - 2 前20都是001 after 00000001
16:32:13.547 [Thread-1] DEBUG enjoy - 3 101首先 before 00000101
16:32:13.547 [Thread-1] DEBUG enjoy - 3 前20都是 000 ing 10101000
16:32:13.547 [Thread-1] DEBUG enjoy - 3 前20都是001 after 00000001
16:32:13.547 [Thread-1] DEBUG enjoy - 4 101首先 before 00000101
16:32:13.547 [Thread-1] DEBUG enjoy - 4 前20都是 000 ing 10101000
16:32:13.547 [Thread-1] DEBUG enjoy - 4 前20都是001 after 00000001
16:32:13.548 [Thread-1] DEBUG enjoy - 5 101首先 before 00000101
16:32:13.548 [Thread-1] DEBUG enjoy - 5 前20都是 000 ing 10101000
16:32:13.548 [Thread-1] DEBUG enjoy - 5 前20都是001 after 00000001
16:32:13.548 [Thread-1] DEBUG enjoy - 6 101首先 before 00000101
16:32:13.548 [Thread-1] DEBUG enjoy - 6 前20都是 000 ing 10101000
16:32:13.549 [Thread-1] DEBUG enjoy - 6 前20都是001 after 00000001
16:32:13.549 [Thread-1] DEBUG enjoy - 7 101首先 before 00000101
16:32:13.549 [Thread-1] DEBUG enjoy - 7 前20都是 000 ing 10101000
16:32:13.550 [Thread-1] DEBUG enjoy - 7 前20都是001 after 00000001
16:32:13.550 [Thread-1] DEBUG enjoy - 8 101首先 before 00000101
16:32:13.550 [Thread-1] DEBUG enjoy - 8 前20都是 000 ing 10101000
16:32:13.551 [Thread-1] DEBUG enjoy - 8 前20都是001 after 00000001
16:32:13.551 [Thread-1] DEBUG enjoy - 9 101首先 before 00000101
16:32:13.551 [Thread-1] DEBUG enjoy - 9 前20都是 000 ing 10101000
16:32:13.551 [Thread-1] DEBUG enjoy - 9 前20都是001 after 00000001
16:32:13.551 [Thread-1] DEBUG enjoy - 10 101首先 before 00000101
16:32:13.552 [Thread-1] DEBUG enjoy - 10 前20都是 000 ing 10101000
16:32:13.552 [Thread-1] DEBUG enjoy - 10 前20都是001 after 00000001
16:32:13.552 [Thread-1] DEBUG enjoy - 11 101首先 before 00000101
16:32:13.552 [Thread-1] DEBUG enjoy - 11 前20都是 000 ing 10101000
16:32:13.552 [Thread-1] DEBUG enjoy - 11 前20都是001 after 00000001
16:32:13.553 [Thread-1] DEBUG enjoy - 12 101首先 before 00000101
16:32:13.553 [Thread-1] DEBUG enjoy - 12 前20都是 000 ing 10101000
16:32:13.553 [Thread-1] DEBUG enjoy - 12 前20都是001 after 00000001
16:32:13.553 [Thread-1] DEBUG enjoy - 13 101首先 before 00000101
16:32:13.553 [Thread-1] DEBUG enjoy - 13 前20都是 000 ing 10101000
16:32:13.553 [Thread-1] DEBUG enjoy - 13 前20都是001 after 00000001
16:32:13.554 [Thread-1] DEBUG enjoy - 14 101首先 before 00000101
16:32:13.554 [Thread-1] DEBUG enjoy - 14 前20都是 000 ing 10101000
16:32:13.554 [Thread-1] DEBUG enjoy - 14 前20都是001 after 00000001
16:32:13.554 [Thread-1] DEBUG enjoy - 15 101首先 before 00000101
16:32:13.554 [Thread-1] DEBUG enjoy - 15 前20都是 000 ing 10101000
16:32:13.555 [Thread-1] DEBUG enjoy - 15 前20都是001 after 00000001
16:32:13.555 [Thread-1] DEBUG enjoy - 16 101首先 before 00000101
16:32:13.555 [Thread-1] DEBUG enjoy - 16 前20都是 000 ing 10101000
16:32:13.555 [Thread-1] DEBUG enjoy - 16 前20都是001 after 00000001
16:32:13.555 [Thread-1] DEBUG enjoy - 17 101首先 before 00000101
16:32:13.556 [Thread-1] DEBUG enjoy - 17 前20都是 000 ing 10101000
16:32:13.556 [Thread-1] DEBUG enjoy - 17 前20都是001 after 00000001
16:32:13.556 [Thread-1] DEBUG enjoy - 18 101首先 before 00000101
16:32:13.556 [Thread-1] DEBUG enjoy - 18 前20都是 000 ing 10101000
16:32:13.556 [Thread-1] DEBUG enjoy - 18 前20都是001 after 00000001
16:32:13.556 [Thread-1] DEBUG enjoy - 19 101首先 before 00000101
16:32:13.557 [Thread-1] DEBUG enjoy - 19 前20都是 000 ing 00000101
16:32:13.557 [Thread-1] DEBUG enjoy - 19 前20都是001 after 00000101
16:32:13.557 [Thread-1] DEBUG enjoy - 20 101首先 before 00000101
16:32:13.558 [Thread-1] DEBUG enjoy - 20 前20都是 000 ing 00000101
16:32:13.558 [Thread-1] DEBUG enjoy - 20 前20都是001 after 00000101
16:32:13.558 [Thread-1] DEBUG enjoy - 21 101首先 before 00000101
16:32:13.559 [Thread-1] DEBUG enjoy - 21 前20都是 000 ing 00000101
16:32:13.559 [Thread-1] DEBUG enjoy - 21 前20都是001 after 00000101
16:32:13.559 [Thread-1] DEBUG enjoy - 22 101首先 before 00000101
16:32:13.559 [Thread-1] DEBUG enjoy - 22 前20都是 000 ing 00000101
16:32:13.559 [Thread-1] DEBUG enjoy - 22 前20都是001 after 00000101
16:32:13.560 [Thread-1] DEBUG enjoy - 23 101首先 before 00000101
16:32:13.560 [Thread-1] DEBUG enjoy - 23 前20都是 000 ing 00000101
16:32:13.560 [Thread-1] DEBUG enjoy - 23 前20都是001 after 00000101
16:32:13.560 [Thread-1] DEBUG enjoy - 24 101首先 before 00000101
16:32:13.560 [Thread-1] DEBUG enjoy - 24 前20都是 000 ing 00000101
16:32:13.560 [Thread-1] DEBUG enjoy - 24 前20都是001 after 00000101
16:32:13.560 [Thread-1] DEBUG enjoy - 25 101首先 before 00000101
16:32:13.561 [Thread-1] DEBUG enjoy - 25 前20都是 000 ing 00000101
16:32:13.561 [Thread-1] DEBUG enjoy - 25 前20都是001 after 00000101
16:32:13.561 [Thread-1] DEBUG enjoy - 26 101首先 before 00000101
16:32:13.561 [Thread-1] DEBUG enjoy - 26 前20都是 000 ing 00000101
16:32:13.561 [Thread-1] DEBUG enjoy - 26 前20都是001 after 00000101
16:32:13.561 [Thread-1] DEBUG enjoy - 27 101首先 before 00000101
16:32:13.561 [Thread-1] DEBUG enjoy - 27 前20都是 000 ing 00000101
16:32:13.562 [Thread-1] DEBUG enjoy - 27 前20都是001 after 00000101
16:32:13.562 [Thread-1] DEBUG enjoy - 28 101首先 before 00000101
16:32:13.562 [Thread-1] DEBUG enjoy - 28 前20都是 000 ing 00000101
16:32:13.562 [Thread-1] DEBUG enjoy - 28 前20都是001 after 00000101
16:32:13.563 [Thread-1] DEBUG enjoy - 29 101首先 before 00000101
16:32:13.563 [Thread-1] DEBUG enjoy - 29 前20都是 000 ing 00000101
16:32:13.563 [Thread-1] DEBUG enjoy - 29 前20都是001 after 00000101
16:32:13.563 [Thread-1] DEBUG enjoy - 30 101首先 before 00000101
16:32:13.563 [Thread-1] DEBUG enjoy - 30 前20都是 000 ing 00000101
16:32:13.563 [Thread-1] DEBUG enjoy - 30 前20都是001 after 00000101
16:32:13.564 [Thread-1] DEBUG enjoy - 31 101首先 before 00000101
16:32:13.564 [Thread-1] DEBUG enjoy - 31 前20都是 000 ing 00000101
16:32:13.564 [Thread-1] DEBUG enjoy - 31 前20都是001 after 00000101
16:32:13.564 [Thread-1] DEBUG enjoy - 32 101首先 before 00000101
16:32:13.564 [Thread-1] DEBUG enjoy - 32 前20都是 000 ing 00000101
16:32:13.564 [Thread-1] DEBUG enjoy - 32 前20都是001 after 00000101
16:32:13.564 [Thread-1] DEBUG enjoy - 33 101首先 before 00000101
16:32:13.565 [Thread-1] DEBUG enjoy - 33 前20都是 000 ing 00000101
16:32:13.565 [Thread-1] DEBUG enjoy - 33 前20都是001 after 00000101
16:32:13.565 [Thread-1] DEBUG enjoy - 34 101首先 before 00000101
16:32:13.565 [Thread-1] DEBUG enjoy - 34 前20都是 000 ing 00000101
16:32:13.565 [Thread-1] DEBUG enjoy - 34 前20都是001 after 00000101
16:32:13.565 [Thread-1] DEBUG enjoy - 35 101首先 before 00000101
16:32:13.565 [Thread-1] DEBUG enjoy - 35 前20都是 000 ing 00000101
16:32:13.565 [Thread-1] DEBUG enjoy - 35 前20都是001 after 00000101
16:32:13.566 [Thread-1] DEBUG enjoy - 36 101首先 before 00000101
16:32:13.566 [Thread-1] DEBUG enjoy - 36 前20都是 000 ing 00000101
16:32:13.566 [Thread-1] DEBUG enjoy - 36 前20都是001 after 00000101
16:32:13.566 [Thread-1] DEBUG enjoy - 37 101首先 before 00000101
16:32:13.566 [Thread-1] DEBUG enjoy - 37 前20都是 000 ing 00000101
16:32:13.566 [Thread-1] DEBUG enjoy - 37 前20都是001 after 00000101
16:32:13.566 [Thread-1] DEBUG enjoy - 38 101首先 before 00000101
16:32:13.567 [Thread-1] DEBUG enjoy - 38 前20都是 000 ing 00000101
16:32:13.567 [Thread-1] DEBUG enjoy - 38 前20都是001 after 00000101
16:32:13.567 [Thread-1] DEBUG enjoy - 39 101首先 before 00000101
16:32:13.567 [Thread-1] DEBUG enjoy - 39 前20都是 000 ing 00000101
16:32:13.568 [Thread-1] DEBUG enjoy - 39 前20都是001 after 00000101
16:32:13.568 [Thread-1] DEBUG enjoy - ======t3=====================================
16:32:13.568 [Thread-2] DEBUG enjoy - 0 00000001
16:32:13.569 [Thread-2] DEBUG enjoy - 0 10101000
16:32:13.569 [Thread-2] DEBUG enjoy - 0 00000001
16:32:13.569 [Thread-2] DEBUG enjoy - 1 00000001
16:32:13.570 [Thread-2] DEBUG enjoy - 1 10101000
16:32:13.570 [Thread-2] DEBUG enjoy - 1 00000001
16:32:13.570 [Thread-2] DEBUG enjoy - 2 00000001
16:32:13.570 [Thread-2] DEBUG enjoy - 2 10101000
16:32:13.570 [Thread-2] DEBUG enjoy - 2 00000001
16:32:13.571 [Thread-2] DEBUG enjoy - 3 00000001
16:32:13.571 [Thread-2] DEBUG enjoy - 3 10101000
16:32:13.571 [Thread-2] DEBUG enjoy - 3 00000001
16:32:13.571 [Thread-2] DEBUG enjoy - 4 00000001
16:32:13.571 [Thread-2] DEBUG enjoy - 4 10101000
16:32:13.571 [Thread-2] DEBUG enjoy - 4 00000001
16:32:13.571 [Thread-2] DEBUG enjoy - 5 00000001
16:32:13.572 [Thread-2] DEBUG enjoy - 5 10101000
16:32:13.572 [Thread-2] DEBUG enjoy - 5 00000001
16:32:13.572 [Thread-2] DEBUG enjoy - 6 00000001
16:32:13.572 [Thread-2] DEBUG enjoy - 6 10101000
16:32:13.572 [Thread-2] DEBUG enjoy - 6 00000001
16:32:13.572 [Thread-2] DEBUG enjoy - 7 00000001
16:32:13.572 [Thread-2] DEBUG enjoy - 7 10101000
16:32:13.573 [Thread-2] DEBUG enjoy - 7 00000001
16:32:13.573 [Thread-2] DEBUG enjoy - 8 00000001
16:32:13.573 [Thread-2] DEBUG enjoy - 8 10101000
16:32:13.573 [Thread-2] DEBUG enjoy - 8 00000001
16:32:13.573 [Thread-2] DEBUG enjoy - 9 00000001
16:32:13.574 [Thread-2] DEBUG enjoy - 9 10101000
16:32:13.574 [Thread-2] DEBUG enjoy - 9 00000001
16:32:13.574 [Thread-2] DEBUG enjoy - 10 00000001
16:32:13.574 [Thread-2] DEBUG enjoy - 10 10101000
16:32:13.574 [Thread-2] DEBUG enjoy - 10 00000001
16:32:13.574 [Thread-2] DEBUG enjoy - 11 00000001
16:32:13.575 [Thread-2] DEBUG enjoy - 11 10101000
16:32:13.575 [Thread-2] DEBUG enjoy - 11 00000001
16:32:13.575 [Thread-2] DEBUG enjoy - 12 00000001
16:32:13.575 [Thread-2] DEBUG enjoy - 12 10101000
16:32:13.575 [Thread-2] DEBUG enjoy - 12 00000001
16:32:13.575 [Thread-2] DEBUG enjoy - 13 00000001
16:32:13.575 [Thread-2] DEBUG enjoy - 13 10101000
16:32:13.578 [Thread-2] DEBUG enjoy - 13 00000001
16:32:13.578 [Thread-2] DEBUG enjoy - 14 00000001
16:32:13.578 [Thread-2] DEBUG enjoy - 14 10101000
16:32:13.578 [Thread-2] DEBUG enjoy - 14 00000001
16:32:13.578 [Thread-2] DEBUG enjoy - 15 00000001
16:32:13.579 [Thread-2] DEBUG enjoy - 15 10101000
16:32:13.579 [Thread-2] DEBUG enjoy - 15 00000001
16:32:13.579 [Thread-2] DEBUG enjoy - 16 00000001
16:32:13.579 [Thread-2] DEBUG enjoy - 16 10101000
16:32:13.579 [Thread-2] DEBUG enjoy - 16 00000001
16:32:13.579 [Thread-2] DEBUG enjoy - 17 00000001
16:32:13.579 [Thread-2] DEBUG enjoy - 17 10101000
16:32:13.579 [Thread-2] DEBUG enjoy - 17 00000001
16:32:13.580 [Thread-2] DEBUG enjoy - 18 00000001
16:32:13.580 [Thread-2] DEBUG enjoy - 18 10101000
16:32:13.580 [Thread-2] DEBUG enjoy - 18 00000001
16:32:13.580 [Thread-2] DEBUG enjoy - 19 00000101
16:32:13.580 [Thread-2] DEBUG enjoy - 19 10101000
16:32:13.580 [Thread-2] DEBUG enjoy - 19 00000001
16:32:13.580 [Thread-2] DEBUG enjoy - 20 00000101
16:32:13.581 [Thread-2] DEBUG enjoy - 20 10101000
16:32:13.581 [Thread-2] DEBUG enjoy - 20 00000001
16:32:13.581 [Thread-2] DEBUG enjoy - 21 00000101
16:32:13.581 [Thread-2] DEBUG enjoy - 21 10101000
16:32:13.581 [Thread-2] DEBUG enjoy - 21 00000001
16:32:13.581 [Thread-2] DEBUG enjoy - 22 00000101
16:32:13.582 [Thread-2] DEBUG enjoy - 22 10101000
16:32:13.582 [Thread-2] DEBUG enjoy - 22 00000001
16:32:13.582 [Thread-2] DEBUG enjoy - 23 00000101
16:32:13.582 [Thread-2] DEBUG enjoy - 23 10101000
16:32:13.582 [Thread-2] DEBUG enjoy - 23 00000001
16:32:13.582 [Thread-2] DEBUG enjoy - 24 00000101
16:32:13.583 [Thread-2] DEBUG enjoy - 24 10101000
16:32:13.583 [Thread-2] DEBUG enjoy - 24 00000001
16:32:13.583 [Thread-2] DEBUG enjoy - 25 00000101
16:32:13.583 [Thread-2] DEBUG enjoy - 25 10101000
16:32:13.583 [Thread-2] DEBUG enjoy - 25 00000001
16:32:13.583 [Thread-2] DEBUG enjoy - 26 00000101
16:32:13.583 [Thread-2] DEBUG enjoy - 26 10101000
16:32:13.584 [Thread-2] DEBUG enjoy - 26 00000001
16:32:13.584 [Thread-2] DEBUG enjoy - 27 00000101
16:32:13.584 [Thread-2] DEBUG enjoy - 27 10101000
16:32:13.584 [Thread-2] DEBUG enjoy - 27 00000001
16:32:13.584 [Thread-2] DEBUG enjoy - 28 00000101
16:32:13.584 [Thread-2] DEBUG enjoy - 28 10101000
16:32:13.584 [Thread-2] DEBUG enjoy - 28 00000001
16:32:13.585 [Thread-2] DEBUG enjoy - 29 00000101
16:32:13.585 [Thread-2] DEBUG enjoy - 29 10101000
16:32:13.585 [Thread-2] DEBUG enjoy - 29 00000001
16:32:13.585 [Thread-2] DEBUG enjoy - 30 00000101
16:32:13.585 [Thread-2] DEBUG enjoy - 30 10101000
16:32:13.585 [Thread-2] DEBUG enjoy - 30 00000001
16:32:13.586 [Thread-2] DEBUG enjoy - 31 00000101
16:32:13.586 [Thread-2] DEBUG enjoy - 31 10101000
16:32:13.586 [Thread-2] DEBUG enjoy - 31 00000001
16:32:13.587 [Thread-2] DEBUG enjoy - 32 00000101
16:32:13.587 [Thread-2] DEBUG enjoy - 32 10101000
16:32:13.587 [Thread-2] DEBUG enjoy - 32 00000001
16:32:13.587 [Thread-2] DEBUG enjoy - 33 00000101
16:32:13.587 [Thread-2] DEBUG enjoy - 33 10101000
16:32:13.587 [Thread-2] DEBUG enjoy - 33 00000001
16:32:13.587 [Thread-2] DEBUG enjoy - 34 00000101
16:32:13.588 [Thread-2] DEBUG enjoy - 34 10101000
16:32:13.588 [Thread-2] DEBUG enjoy - 34 00000001
16:32:13.588 [Thread-2] DEBUG enjoy - 35 00000101
16:32:13.588 [Thread-2] DEBUG enjoy - 35 10101000
16:32:13.588 [Thread-2] DEBUG enjoy - 35 00000001
16:32:13.588 [Thread-2] DEBUG enjoy - 36 00000101
16:32:13.588 [Thread-2] DEBUG enjoy - 36 10101000
16:32:13.588 [Thread-2] DEBUG enjoy - 36 00000001
16:32:13.589 [Thread-2] DEBUG enjoy - 37 00000101
16:32:13.589 [Thread-2] DEBUG enjoy - 37 10101000
16:32:13.589 [Thread-2] DEBUG enjoy - 37 00000001
16:32:13.589 [Thread-2] DEBUG enjoy - 38 00000101
16:32:13.589 [Thread-2] DEBUG enjoy - 38 10101000
16:32:13.589 [Thread-2] DEBUG enjoy - 38 00000001
16:32:13.589 [Thread-2] DEBUG enjoy - 39 00000101
16:32:13.589 [Thread-2] DEBUG enjoy - 39 10101000
16:32:13.590 [Thread-2] DEBUG enjoy - 39 00000001
16:32:14.092 [main] DEBUG enjoy - com.liheng.A object internals:
 OFFSET  SIZE      TYPE DESCRIPTION                               VALUE
      0     4           (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)
      4     4           (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4           (object header)                           2c 6a 01 f8 (00101100 01101010 00000001 11111000) (-134125012)
     12     1   boolean A.f                                       false
     13     3           (alignment/padding gap)                  
     16     4    byte[] A.aByte                                   [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
     20     4           (loss due to the next object alignment)
Instance size: 24 bytes
Space losses: 3 bytes internal + 4 bytes external = 7 bytes total


Process finished with exit code 0

*/

结果分析:当一个偏向锁,如果撤销次数到达40次,jvm就会将这个对象所对应类的所有对象都撤销偏向锁;并且新建的实例化对象也是不可偏向的。

log.debug(ClassLayout.parseInstance(new A()).toPrintable());//打印结果为001 说明新建的对象也是不可偏向的 和四中的进行对比
OFFSET  SIZE      TYPE DESCRIPTION                               VALUE
      0     4           (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)
      4     4           (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4           (object header)                           2c 6a 01 f8 (00101100 01101010 00000001 11111000) (-134125012)
     12     1   boolean A.f                                       false
     13     3           (alignment/padding gap)                  
     16     4    byte[] A.aByte                                   [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
     20     4           (loss due to the next object alignment)
Instance size: 24 bytes
Space losses: 3 bytes internal + 4 bytes external = 7 bytes total

六、锁膨胀流程图

最后总结锁膨胀流程图:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半路笙歌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值