Sychronized和ReentrantLock有哪些不同点

`synchronized` 和 `ReentrantLock` 是 Java 中用于实现线程同步的两种机制,它们之间存在多方面的不同,主要体现在以下几点:

1. 用法上的差异:
- `synchronized` 是 Java 的关键字,可以直接用于方法或代码块。对于方法,可以同步整个方法;对于代码块,可以更细粒度地控制同步范围
- `ReentrantLock` 是 `java.util.concurrent.locks` 包下的一个类,使用时需要实例化,然后通过 `lock()` 和 `unlock()` 方法手动进行加锁和解锁操作。

2. 锁的获取与释放机制:
- `synchronized` 的锁是隐式管理的,编译器会在进入和退出同步块时自动插入获取和释放锁的指令,无需手动控制。
- `ReentrantLock` 需要程序员显式地在代码中调用 `lock()` 来获取锁,以及在合适的时机调用 `unlock()` 来释放锁,这提供了更大的灵活性但也要求更高的编程精确度。

3. 锁的公平性:
- `synchronized` 默认采用非公平锁策略,即线程尝试获取锁的顺序不一定按照它们请求锁的顺序。

public class SynchronizedExample {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public synchronized int getCount() {
        return count;
    }
}


- `ReentrantLock` 默认也是非公平锁,但可以通过构造函数参数指定为公平锁,公平锁会按照线程请求锁的顺序来分配锁,减少“饥饿”现象。

public class ReentrantLockExample {
    private final ReentrantLock lock = new ReentrantLock();
    private int count = 0;

    public void increment() {
        lock.lock(); // 显式加锁
        try {
            count++;
        } finally {
            lock.unlock(); // 保证在finally中释放锁,防止异常导致锁未释放
        }
    }

    public int getCount() {
        lock.lock(); // 读取也需要加锁以保证一致性
        try {
            return count;
        } finally {
            lock.unlock();
        }
    }
}

4. 响应中断的能力:
- `synchronized` 不支持在等待锁的过程中响应中断,如果线程在等待锁时被中断,中断状态会被清除,但线程会继续等待锁。
- `ReentrantLock` 支持中断,调用 `lockInterruptibly()` 方法获取锁时,如果线程被中断,则会抛出 `InterruptedException`,从而可以及时处理中断情况。

5. 底层实现:
- `synchronized` 是由 JVM 实现的,基于监视器锁(Monitor)机制。
- `ReentrantLock` 基于 AbstractQueuedSynchronizer (AQS)框架,提供了更高级的功能,如条件变量(Condition objects)等。

6. 性能:
- 在早期的Java版本中,`ReentrantLock` 通常比 `synchronized` 更灵活且性能更好,因为它提供了更多的控制选项。但在Java后续版本中,JVM对 `synchronized` 的性能做了大量优化,两者之间的性能差距已缩小,具体取决于使用场景。

7. 异常处理:
- 当 `synchronized` 代码块中发生异常时,JVM 会确保锁自动释放,避免死锁。
- 使用 `ReentrantLock` 时,需要在 `finally` 块中手动释放锁,以防异常导致锁未被释放。

8. 额外功能:
- `ReentrantLock` 提供了 `tryLock()` 方法,允许尝试获取锁而不阻塞,以及带有超时参数的版本,这在某些同步策略中非常有用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值