为了证明某个面试官的错误言论,特意做了本实验。
在面试中被问到,synchronized与ReentrantLock谁的性能好些?
我答到,在少量并发下性能差不多,ReentrantLock相对好用些,但是在大量并发下synchronized性能要好些,结果面试官直接怼我说我记错了。
话不多说直接上代码验证,用synchronized,ReentrantLock锁锁住一样的代码块,并对一个数执行自加的操作。
synchronized锁代码块:
class Sync implements Runnable {
private static volatile int num = 0;
@Override
public void run() {
synchronized ("") {
if (num == 0) {
System.out.println("Sync start:"+System.currentTimeMillis());
}
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
++num;
if (num == Test.time) {
System.out.println("Sync end:"+System.currentTimeMillis());
}
}
}
}
ReentrantLock锁代码块:
class Lock implements Runnable {
private static volatile int num = 0;
private static ReentrantLock reentrantLock = new ReentrantLock();
@Override
public void run() {
reentrantLock.lock();
if (num == 0) {
System.out.println("Lock start:"+System.currentTimeMillis());
}
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
++num;
if (num == Test.time) {
System.out.println("Lock end:"+System.currentTimeMillis());
}
reentrantLock.unlock();
}
}
测试代码:
public static void testSync() {
for (int i = 0; i < Test.time; i++) {
Thread syncThread = new Thread(new Sync());
Thread lockthread = new Thread(new Lock());
syncThread.start();
lockthread.start();
}
}
10个并发线程执行结果:
从执行结果来说并发线程较少的情形下,二者效率差不多,但是在实际使用中ReentrantLockantLock相对灵活些,支持tryLock、超时机制、公平锁和非公平锁,然而synchronized是由虚拟机决定,无超时机制,是非公平锁,可控性不强。
1000个线程并发执行结果:
在并发相对较高的情形下ReentrantLockantLock的获取锁效率相对较低,另外ReentrantLockantLock是自循锁,消耗CPU资源也比synchronized大。
本文地址:https://blog.csdn.net/u014267900/article/details/107370627
如对本文有疑问, 点击进行留言回复!!
springcloud中feign调用处理mybatis-plus Ipage反序列化问题。
Flume 史上最全面的大数据学习第十篇(一) 别再说不知道flume是什么了
网友评论