由于JVM启动的时候,前4秒带synchronized的方法,上的是轻量级锁。原因是应为在JVM启动时,本身就运行了很多带synchronized关键字的方法,但是这些大多都是轻量级锁。如果直接设置成偏向锁,在锁升级的过程中,偏向锁清除锁的过程比较复杂,导致在升级锁过程中消耗太多的资源和时间。所以延迟偏向锁。
public class A {
int i=0;
public synchronized void parse(){
i++;
// JOLExample6.countDownLatch.countDown();
}
}
public class Example {
public static void main(String[] args) throws Exception {
A a = new A();
long start = System.currentTimeMillis();
for(int i=0;i<1000000000L;i++){
a.parse();
}
long end = System.currentTimeMillis();
System.out.println(String.format("%sms", end - start));
}
}
轻量级锁运行时间
设置JVM的对应的参数
-XX:BiasedLockingStartupDelay=0
设置延迟锁参数为0
偏向锁的运行时间
在次运行同样的方法,时间很明显的节省了很多。
让两个线程去竞争,膨胀成重量锁
public class JOLExample6 {
static CountDownLatch countDownLatch = new CountDownLatch(1000000000);
public static void main(String[] args) throws Exception {
final A a = new A();
long start = System.currentTimeMillis();
for(int i=0;i<2;i++){
new Thread(){
@Override
public void run() {
while (countDownLatch.getCount() > 0) {
a.parse();
}
}
}.start();
}
countDownLatch.await();
long end = System.currentTimeMillis();
System.out.println(String.format("%sms", end - start));
}
}
重量级锁的运行时间
通过简单的实验,得到性能 排序,偏向锁,轻量级锁,重量级锁