packageorg.example;importlombok.extern.slf4j.Slf4j;importorg.example.entity.A;importorg.openjdk.jol.info.ClassLayout;importjava.util.ArrayList;importjava.util.List;importjava.util.concurrent.locks.LockSupport;@Slf4jpublicclassTestInflate{staticThread t1;staticThread t2;staticint loopFlag =20;publicstaticvoidmain(String[] args){finalList<A> list =newArrayList<>();
t1 =newThread(){@Overridepublicvoidrun(){for(int i =0; i < loopFlag; i++){A a =newA();
list.add(a);
log.debug("加锁前"+ i +" "+ClassLayout.parseInstance(a).toPrintable());synchronized(a){
log.debug("加锁中"+ i +" "+ClassLayout.parseInstance(a).toPrintable());}
log.debug("加锁结束"+ i +" "+ClassLayout.parseInstance(a).toPrintable());}
log.debug("============t1 都是偏向锁=============");//防止竞争 执行完后叫醒 t2LockSupport.unpark(t2);}};
t2 =newThread(){@Overridepublicvoidrun(){//防止竞争 先睡眠t2LockSupport.park();for(int i =0; i < loopFlag; i++){A a = list.get(i);//因为从list当中拿出都是偏向t1
log.debug("加锁前"+ i +" "+ClassLayout.parseInstance(a).toPrintable());synchronized(a){//前20撤销偏向t1;然后升级轻量指向t2线程栈当中的锁记录//后面的发送批量偏向t2
log.debug("加锁中 "+ i +" "+ClassLayout.parseInstance(a).toPrintable());}//因为前20是轻量,释放之后为无锁不可偏向//但是后面的是偏向t2 释放之后依然是偏向t2
log.debug("加锁结束"+ i +" "+ClassLayout.parseInstance(a).toPrintable());}
log.debug("新产生的对象"+ClassLayout.parseInstance(newA()).toPrintable());}};
t1.start();
t2.start();}}
packageorg.example;importlombok.extern.slf4j.Slf4j;importorg.example.entity.A;importorg.openjdk.jol.info.ClassLayout;importjava.util.ArrayList;importjava.util.List;importjava.util.concurrent.locks.LockSupport;@Slf4jpublicclassTestInflate{staticThread t1;staticThread t2;staticThread t3;staticint loopFlag =40;publicstaticvoidmain(String[] args){finalList<A> list =newArrayList<>();
t1 =newThread(){@Overridepublicvoidrun(){for(int i =0; i < loopFlag; i++){A a =newA();
list.add(a);
log.debug("加锁前"+ i +" "+ClassLayout.parseInstance(a).toPrintable());synchronized(a){
log.debug("加锁中"+ i +" "+ClassLayout.parseInstance(a).toPrintable());}
log.debug("加锁结束"+ i +" "+ClassLayout.parseInstance(a).toPrintable());}
log.debug("============t1 都是偏向锁=============");//防止竞争 执行完后叫醒 t2LockSupport.unpark(t2);}};
t2 =newThread(){@Overridepublicvoidrun(){//防止竞争 先睡眠t2LockSupport.park();for(int i =0; i < loopFlag; i++){A a = list.get(i);//因为从list当中拿出都是偏向t1
log.debug("加锁前"+ i +" "+ClassLayout.parseInstance(a).toPrintable());synchronized(a){//前20撤销偏向t1;然后升级轻量指向t2线程栈当中的锁记录//后面的发送批量偏向t2
log.debug("加锁中 "+ i +" "+ClassLayout.parseInstance(a).toPrintable());}//因为前20是轻量,释放之后为无锁不可偏向//但是后面的是偏向t2 释放之后依然是偏向t2
log.debug("加锁结束"+ i +" "+ClassLayout.parseInstance(a).toPrintable());}
log.debug("新产生的对象"+ClassLayout.parseInstance(newA()).toPrintable());LockSupport.unpark(t3);}};
t3 =newThread(){@Overridepublicvoidrun(){//防止竞争 先睡眠t2LockSupport.park();for(int i =0; i < loopFlag; i++){A a = list.get(i);
log.debug("加锁前"+ i +" "+ClassLayout.parseInstance(a).toPrintable());synchronized(a){
log.debug("加锁中 "+ i +" "+ClassLayout.parseInstance(a).toPrintable());}
log.debug("加锁结束"+ i +" "+ClassLayout.parseInstance(a).toPrintable());}
log.debug("新产生的对象"+ClassLayout.parseInstance(newA()).toPrintable());}};
t1.start();
t2.start();
t3.start();}}