public class LockFlate {
public static void main(String[] args) throws Exception {
Thread.sleep(5000);
List<A> listA = new ArrayList<>();
Thread t1 = new Thread(() -> {
for (int i = 0; i <100 ; i++) {
A a = new A();
synchronized (a){
listA.add(a);
}
}
});
t1.start();
Thread.sleep(3000);
Thread t2 = new Thread(() -> {
//这里循环了40次。达到了批量撤销的阈值
for (int i = 0; i < 60; i++) {
A a =listA.get(i);
synchronized (a){
out.print("");
}
}
});
t2.start();
Thread.sleep(3000);
Thread t3 = new Thread(() -> {
//这里循环了40次。达到了批量撤销的阈值
for (int i = 20; i < 60; i++) {
A a =listA.get(i);
synchronized (a){
out.print("");
}
}
});
t3.start();
Thread.sleep(3000);
/*
前后输出结果不一致。
如果先执行这段,则偏向锁不撤销。
如果这段放到后面执行,偏向锁批量撤销
out.println((ClassLayout.parseInstance(listA.get(99)).toPrintable()));
synchronized (listA.get(99)){
out.println((ClassLayout.parseInstance(listA.get(99)).toPrintable()));
}*/
out.println("重新输出新实例A");
out.println((ClassLayout.parseInstance(new A()).toPrintable()));
out.println((ClassLayout.parseInstance(listA.get(99)).toPrintable()));
synchronized (listA.get(99)){
out.println((ClassLayout.parseInstance(listA.get(99)).toPrintable()));
}
}
}
class A{
}