欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

synchronized与ReentrantLock的并发性能对比

程序员文章站 2022-07-06 08:30:32
为了证明某个面试官的错误言论,特意做了本实验。在面试中被问到,synchronized与ReentrantLock谁的性能好些?我答到,在少量并发下性能差不多,ReentrantLock相对好用些,但是在大量并发下synchronized性能要好些,结果面试官直接怼我说我记错了。话不多说直接上代码验证,用synchronized,ReentrantLock锁锁住一样的代码块,并对一个数执行自加的操作。synchronized锁代码块:class Sync implements Runn...

为了证明某个面试官的错误言论,特意做了本实验。

在面试中被问到,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个并发线程执行结果:

synchronized与ReentrantLock的并发性能对比

从执行结果来说并发线程较少的情形下,二者效率差不多,但是在实际使用中ReentrantLockantLock相对灵活些,支持tryLock、超时机制、公平锁和非公平锁,然而synchronized是由虚拟机决定,无超时机制,是非公平锁,可控性不强。

1000个线程并发执行结果:

synchronized与ReentrantLock的并发性能对比

在并发相对较高的情形下ReentrantLockantLock的获取锁效率相对较低,另外ReentrantLockantLock是自循锁,消耗CPU资源也比synchronized大。

本文地址:https://blog.csdn.net/u014267900/article/details/107370627

相关标签: java 面试