synchronized

简介: synchronized

ReentrantLock 是 Java 中的一个可重入锁,它比 synchronized 关键字提供了更丰富的特性和灵活性。以下是 ReentrantLock 相对于 synchronized 的一些优势:

  1. 公平性

    • ReentrantLock 允许你选择锁的公平性。如果设置为公平锁,那么等待时间最长的线程将会获取到锁,这有助于避免线程饥饿。而 synchronized 锁默认是不公平的,它不保证等待时间最长的线程能够最先获取到锁。
  2. 可中断性

    • 使用 ReentrantLocklockInterruptibly() 方法,线程在尝试获取锁的过程中可以响应中断,即如果线程在等待获取锁时被中断,它会抛出 InterruptedException 并立即返回,而不是一直等待锁释放。
  3. 超时

    • ReentrantLock 提供了 tryLock(long timeout, TimeUnit unit) 方法,允许线程尝试在给定的时间内获取锁。如果在指定的时间内锁没有被获取到,线程可以放弃等待,继续执行其他任务,而不是无限期地等待锁的释放。
  4. 非阻塞获取

    • ReentrantLocktryLock() 方法允许线程尝试非阻塞地获取锁。如果锁不可用,线程可以立即返回,而不必浪费CPU时间进行等待。
  5. 多个条件变量

    • synchronized 关键字配合 wait()notify()/notifyAll() 使用不同,ReentrantLock 可以与 Condition 对象配合使用,允许线程等待特定的条件成立。这意味着你可以有多个条件队列,线程可以等待不同的条件,而 synchronized 锁只有一个条件队列。
  6. 实现锁的复合操作

    • 通过 ReentrantLock,你可以在获取、释放锁的同时执行多个操作,这些操作可以作为一个原子操作。而 synchronized 则需要通过额外的方式(如使用原子类)来实现复合操作。

使用示例:

ReentrantLock lock = new ReentrantLock();

public void performAction() {
   
    lock.lock(); // 获取锁
    try {
   
        // 执行受保护的操作
    } finally {
   
        lock.unlock(); // 确保释放锁
    }
}

// 可中断的锁获取
lock.lockInterruptibly();
try {
   
    // 执行操作
} catch (InterruptedException e) {
   
    // 处理中断
} finally {
   
    lock.unlock();
}

// 超时获取锁
if (lock.tryLock(100, TimeUnit.MILLISECONDS)) {
   
    try {
   
        // 执行操作
    } finally {
   
        lock.unlock();
    }
} else {
   
    // 处理超时情况
}

// 使用条件对象
Condition condition = lock.newCondition();
lock.lock();
try {
   
    while (!conditionToBeMet()) {
   
        condition.await(); // 等待条件成立
    }
    // 执行操作
} catch (InterruptedException e) {
   
    // 处理中断
} finally {
   
    lock.unlock();
}

// 信号通知
lock.lock();
try {
   
    // 改变条件状态
    condition.signal(); // 唤醒等待的线程
} finally {
   
    lock.unlock();
}

注意事项:

  • 使用 ReentrantLock 时,务必在 finally 块中释放锁,以避免死锁。
  • 相比于 synchronizedReentrantLock 需要显式地管理锁的获取和释放,这在一定程度上增加了编码的复杂性。
  • 在某些情况下,synchronized 的性能可能优于 ReentrantLock,因为它是一个更轻量级和更内联的操作。

总的来说,ReentrantLock 提供了比 synchronized 更高级的特性,适用于需要这些特性的复杂同步场景。然而,对于简单的同步需求,synchronized 仍然是一个简洁且有效的选择。

目录
相关文章
|
9月前
总结 synchronized
总结 synchronized
33 0
|
5天前
|
存储 安全 Java
|
7月前
|
安全 算法 Java
synchronized 同步锁
Java中的synchronized关键字用于实现线程同步,可以修饰方法或代码块。 1. 修饰方法:当一个方法被synchronized修饰时,只有获得该方法的锁的线程才能执行该方法。其他线程需要等待锁的释放才能执行该方法。 2. 修饰代码块:当某个对象被synchronized修饰时,任何线程在执行该对象中被synchronized修饰的代码块时,必须先获得该对象的锁。其他线程需要等待锁的释放才能执行同步代码块。Java中的每个对象都有一个内置锁,当一个对象被synchronized修饰时,它的内置锁就起作用了。只有获得该锁的线程才能访问被synchronized修饰的代码段。使用synch
40 0
|
7月前
ReentrantLock和Synchronized简单比较
ReentrantLock和Synchronized简单比较
24 0
|
8月前
Synchronized
作用:能够保证在同一时刻最多有一个线程执行该段代码,以保证并发的安全性。(当第一个线程去执行该段代码的时候就拿到锁,并独占这把锁,当方法执行结束或者一定条件后它才释放这把锁,在没释放锁之前,所有的线程处于等待状态)
33 0
|
10月前
|
Java
synchronized的总结
synchronized的总结
synchronized的总结
|
10月前
|
程序员
ReentrantLock与synchronized的区别
ReentrantLock与synchronized的区别
|
10月前
|
前端开发 Java Spring
方法上加上 synchronized 就可以了么
方法上加上 synchronized 就可以了么
|
10月前
|
存储 缓存 安全
synchronized的简单理解
synchronized的简单理解
68 0
|
11月前
|
Java 编译器
10.关于synchronized的一切,我都写在这里了
大家好,我是王有志。我们已经完成了synchronized的学习,今天我们利用学习到的知识去回答一些关热点问题。
55 0