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);
}
}
只要没有线程复用,运行结果均与预料一致。
博客指出,在没有线程复用的情况下,运行结果都与预料一致,涉及到线程运行状态相关信息技术内容。
676

被折叠的 条评论
为什么被折叠?



