当前位置: 移动技术网 > IT编程>开发语言>Java > synchronized与ReentrantLock的并发性能对比

synchronized与ReentrantLock的并发性能对比

2020年07月17日  | 移动技术网IT编程  | 我要评论

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

在面试中被问到,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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网