Sync的代码自我验证:

博客指出,在没有线程复用的情况下,运行结果都与预料一致,涉及到线程运行状态相关信息技术内容。
package com.luban.layout;
import org.openjdk.jol.info.ClassLayout;

import java.util.ArrayList;
import java.util.List;

import static java.lang.System.out;

public class JOLExample14 {
    static A a;

    public static void main(String[] args) throws Exception {
        Thread.sleep(6000);             //JVM启动时偏向锁延迟5s启动。休眠等待开启偏向锁
        final List<A> list = new ArrayList<>();
        for(int i=0;i<100;i++){
            a = new A();
            list.add(a);
        }
        Thread t1 = new Thread(){
            @Override
            public void run() {
                for (int i = 0; i < list.size(); i++) {
                    synchronized (list.get(i)){
                        if(i==30){
                            out.println("t1:预期打印偏向锁,偏向线程t1"+ClassLayout.parseInstance(list.get(i)).toPrintable());
                        }
                    }
                }
            }
        };
        t1.start();
        t1.join();
        Thread thread = new Thread(){
            @Override
            public void run() {
                super.run();
            }
        };
        thread.start();     //防止线程复用
        Thread t2 = new Thread(){
            @Override
            public void run() {
                for (int i = 0; i < list.size(); i++) {
                    a = list.get(i);
                    if(i==20){
                        a=list.get(5);
                    }
                    synchronized (a){
                        if(i==18){
                            out.println("t2:预期打印轻量级锁"+ClassLayout.parseInstance(a).toPrintable());
                        }
                        if(i==19){          //达到20的批量重偏向阈值
                            out.println("t2:预期打印不可偏向的无锁状态"+ClassLayout.parseInstance(list.get(1)).toPrintable());
                            out.println("t2:预期打印偏向锁,偏向t2"+ClassLayout.parseInstance(a).toPrintable());
                            out.println("t2:预期打印偏向锁,偏向t1"+ClassLayout.parseInstance(list.get(30)).toPrintable());
                        }
                        if(i==20){          //a5已经变成不可偏向无锁状态,再次同步直接变成轻量级锁
                            out.println("t2:预期打印轻量级锁"+ClassLayout.parseInstance(a).toPrintable());
                        }

                    }
                }
            }
        };
        t2.start();
        t2.join();
        Thread.sleep(10000);
    }
}

只要没有线程复用,运行结果均与预料一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值