ReentrantLock与synchronized的区别

文章对比了Java中synchronized和ReentrantLock两种锁机制,解释了它们的实现原理、获取锁的方式以及可重入性、等待可中断性和公平性的差异。ReentrantLock提供了更细粒度的控制,支持公平锁和中断操作,而synchronized则更为简洁,但在高并发下可能性能稍逊。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

synchronized

ReentrantLock

ReentrantLock尝试获取锁

synchronized和ReentrantLock两种锁的区别

相同点

不同点


synchronized

实现描述: 当一个线程进入synchronized代码块时,会尝试获取锁。如果锁没有被其他线程占用,则获取锁成功,该线程可以执行代码块中的逻辑。当线程执行完代码块后,会释放锁,以供其他线程获取。

public class Counter {
    private int count;

    public void add(int n) {
        synchronized(this) {
            count += n;
        }
    }
}

ReentrantLock

ReentrantLock使用的是显示锁(也称为可重入锁)的机制,它允许线程在获取锁之后再次获取同一个锁,并且支持将锁的获取与释放分开控制。

public class Counter {
    private final Lock lock = new ReentrantLock();
    private int count;

    public void add(int n) {
        lock.lock();
        try {
            count += n;
        } finally {
            lock.unlock();
        }
    }
}

ReentrantLock尝试获取锁

public class ReentrantLockExample {
	private ReentrantLock lock = new ReentrantLock();

	public void doSomething() {
		if (lock.tryLock()) {
			try {
				// 成功获取锁后执行的代码逻辑
				System.out.println(Thread.currentThread().getName() + "ok");
				// 执行其他业务逻辑
			} finally {
				lock.unlock();
			}
		} else {
			// 未成功获取锁时的处理逻辑
			System.out.println(Thread.currentThread().getName() + "no");
			// 可以选择等待一段时间后重新尝试获取锁,或者执行其他业务逻辑
		}
	}
}

synchronized和ReentrantLock两种锁的区别

相同点

  1. 目的:synchronized和ReentrantLock都是为了实现线程之间的同步,保证多个线程对共享资源的安全访问。
  2. 实现原理:它们都采用了独占锁(互斥锁)的机制,同一时间只允许一个线程访问被锁保护的代码块或方法。

不同点

  1. 锁的获取方式不同:synchronized是隐式锁,即在进入同步代码块或方法时自动获取锁,退出时自动释放锁;而reentrantlock是显式锁,需要手动获取和释放锁。
  2. 可重入性不同:synchronized是可重入锁,即同一个线程可以多次获取同一把锁,而reentrantlock也是可重入锁,但需要手动实现。
  3. 等待可中断性不同:synchronized不支持等待可中断,即线程无法响应中断请求,而reentrantlock支持等待可中断,可以响应中断请求。
  4. 公平性不同:synchronized是非公平锁,即无法保证等待时间最长的线程最先获取锁,而reentrantlock可以通过构造函数指定是否为公平锁。
  5. 性能不同:在低并发情况下,synchronized的性能优于reentrantlock,但在高并发情况下,reentrantlock的性能优于synchronized。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lcannal

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值