ReentrantLock 和synchronize比较

ReentrantLocksynchronized 都是 Java 中用来实现线程同步的机制,但它们各自有不同的优缺点和适用场景。以下是它们的比较:

1. 基本概念

  • synchronized: 是 Java 内置的同步机制。可以在方法或代码块上使用,确保同一时间只有一个线程可以执行同步代码,其他线程会被阻塞直到获得锁。

  • ReentrantLock: 是 Java 5 引入的 java.util.concurrent.locks 包中的显式锁,它提供了更灵活和更强大的锁机制。

2. 优缺点对比

特性synchronizedReentrantLock
锁的获取和释放自动(隐式),在进入同步块/方法时获取,退出时自动释放手动(显式),需要显式地调用 lock() 获取锁和 unlock() 释放锁
可中断性不支持中断等待锁的线程支持 lockInterruptibly(),可以中断等待中的线程
超时获取锁不支持支持 tryLock(long timeout, TimeUnit unit),可以尝试在一段时间内获取锁
公平锁不支持公平锁,默认是非公平的支持公平锁,通过 new ReentrantLock(true) 创建
锁投票无显式锁投票概念通过 tryLock() 可以实现非阻塞式尝试获取锁
条件等待使用 wait()notify()/notifyAll() 实现条件等待提供了 Condition 对象,通过 await()signal()/signalAll() 实现条件等待和通知
性能开销JVM 内置,性能较好,但在大量线程争用时可能出现锁竞争导致的性能问题更灵活,但由于是显式控制,开销可能稍高,适合高并发场景下的精细控制
重入锁支持支持
可见性通过内存屏障确保可见性通过内存屏障确保可见性
锁优化JVM 对 synchronized 有诸如偏向锁、轻量级锁等优化没有类似优化,但适合复杂锁控制

3. 使用场景

  • synchronized:

    • 简单同步场景: 当你需要基本的线程同步时,synchronized 是一个直接有效的选择,代码简洁,适合大多数简单的锁场景。
    • 偏向锁优化: 在轻量线程争用的场景下,JVM 会对 synchronized 做性能优化(如偏向锁和轻量级锁)。
    • 可维护性: synchronized 更容易阅读和维护,因为它是 Java 语言的原生同步机制。
  • ReentrantLock:

    • 复杂同步需求: 当需要更细粒度的锁控制(如公平锁、可中断锁、超时获取锁等)时,ReentrantLock 是首选。
    • 高并发环境: 在高并发情况下需要灵活控制锁的获取与释放时,可以使用 ReentrantLock。例如,等待中断、超时尝试获取锁。
    • 条件等待: 如果你需要多个条件变量来控制线程的执行(例如使用 Condition 来实现复杂的等待/通知机制),ReentrantLock 提供了比 synchronized 更好的支持。

4. 示例

  • synchronized 使用示例:

    public class SynchronizedExample {
        public synchronized void syncMethod() {
            // 同步方法
            System.out.println("In synchronized method");
        }
    
        public void syncBlock() {
            synchronized (this) {
                // 同步代码块
                System.out.println("In synchronized block");
            }
        }
    }
    
  • ReentrantLock 使用示例:

    import java.util.concurrent.locks.ReentrantLock;
    
    public class ReentrantLockExample {
        private final ReentrantLock lock = new ReentrantLock();
    
        public void performTask() {
            lock.lock();
            try {
                // 临界区
                System.out.println("In locked section");
            } finally {
                lock.unlock();
            }
        }
    }
    

总结

  • 如果你只需要基本的锁机制并希望保持代码简洁,synchronized 是优先选择。
  • 如果你需要更高的灵活性(如锁的可中断、超时等待、公平锁等),ReentrantLock 提供了更强大的功能,适合复杂的并发控制场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

yymagicer

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

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

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

打赏作者

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

抵扣说明:

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

余额充值