synchronized优化机制
逐步升级锁:
无状态-》偏向锁-》轻量级锁-》重量级锁
锁升级过程

偏向锁: 对象头带线程id,判断是否为同一个线程id

通过jol可以打印出对象的信息

        <dependency>
            <groupId>org.openjdk.jol</groupId>
            <artifactId>jol-core</artifactId>
            <version>0.10</version>
        </dependency>
public static void main(String[] args) throws Exception {
        User userTemp = new User();
        System.out.println("无状态(001):" + ClassLayout.parseInstance(userTemp).toPrintable());

        /**
         * jvm默认延时4s自动开启偏向锁,可通过 -XX:BiasedLockingStartupDelay=0 取消延时
         * 如果不要偏向锁,可通过 -XX:-UseBiasedLocking = false 来设置
         */
        Thread.sleep(5000);
        User user = new User();
        System.out.println("启用偏向锁(101):" + ClassLayout.parseInstance(user).toPrintable());

        for (int i = 0; i < 2; i++) {
            synchronized (user) {
                System.out.println("偏向锁(101)(带线程id):" + ClassLayout.parseInstance(user).toPrintable());
            }
            // 偏向锁释放并不会改变 头部
            System.out.println("偏向锁释放(101)(带线程id):" + ClassLayout.parseInstance(user).toPrintable());
        }

        //开启线程
        new Thread(() -> {
            synchronized (user) {
                System.out.println("轻量级锁(00):" + ClassLayout.parseInstance(user).toPrintable());
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();

        Thread.sleep(1000);
        // 上一个子线程未结束时去竞争 user对象,升级到重量级锁
        new Thread(() -> {
            synchronized (user) {
                System.out.println("重量级锁(10):" + ClassLayout.parseInstance(user).toPrintable());
            }
        }).start();
    }