ReentrantLock与synchronized的区别

简介: ReentrantLock与synchronized的区别


(1)synchronized是独占锁,加锁和解锁的过程自动进行,易于操作,但不够灵活。 ReentrantLock也是独占锁,加锁和解锁的过程需要手动进行,不易操作,但非常灵活。

(2)synchronized可重入,因为加锁和解锁自动进行,不必担心最后是否释放锁;ReentrantLock 也可重入,但加锁和解锁需要手动进行,且次数需一样,否则其他线程无法获得锁。

(3)synchronized不可响应中断,一个线程获取不到锁就一直等着;ReentrantLock可以响应中 断。

ReentrantLock好像比synchronized关键字没好太多,我们再去看看synchronized所没有的,一个 最主要的就是ReentrantLock还可以实现公平锁机制。什么叫公平锁呢?也就是在锁上等待时间最长的 线程将获得锁的使用权。通俗的理解就是谁排队时间最长谁先执行获取锁。

public class T6 {

//原子类用于计数
volatile AtomicInteger num = new AtomicInteger(50);
//true 开启公平锁
ReentrantLock lock = new ReentrantLock(true);

public static void main(String[] args) {
    T6 t = new T6();
    new Thread(t::min, "T1").start();
    new Thread(t::min, "T2").start();
    new Thread(t::min, "T3").start();
    new Thread(t::min, "T4").start();
    new Thread(t::min, "T5").start();
    new Thread(t::min, "T6").start();
    new Thread(t::min, "T7").start();
}
void min() {
    while (true) {
        //synchronized (this) {
        if (num.get() > 0) {
            //加锁
            lock.lock();
            num.decrementAndGet();
            System.out.printf("%s卖出了一票,剩余%d票%n", Thread.currentThread().getName(), num.get());
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //为零的时候退出循环
            if (num.get() < 1) {
                break;
            }
            //解锁
            lock.unlock();
            // }
        }

    }
}

}
结果为:

目录
相关文章
|
9月前
|
Java
【面试问题】Synchronized 和 ReentrantLock 区别?
【1月更文挑战第27天】【面试问题】Synchronized 和 ReentrantLock 区别?
|
6月前
|
存储 Java 程序员
synchronized的原理以及与ReentrantLock的区别
`synchronized`和`ReentrantLock`均为Java线程同步机制,确保共享资源的单一时刻独占访问。`synchronized`关键字直接嵌入JVM,可通过修饰方法或代码块实现对象锁或监视器锁,具备可重入性,依赖Mark Word进行锁状态管理。`ReentrantLock`则需显式调用`lock()`和`unlock()`,提供更灵活控制,如公平锁、尝试锁及条件变量。两者在语法、灵活性和异常处理上有所差异,但均支持可重入性。性能方面,随JDK优化,`synchronized`在某些场景下甚至优于`ReentrantLock`。选择使用哪个取决于具体需求和上下文。
|
8月前
|
安全 Java 开发者
Java并发编程:深入理解synchronized和ReentrantLock
在Java并发编程中,正确使用同步机制是确保线程安全的关键。本文将深入探讨Java内置的两种同步机制——synchronized关键字和ReentrantLock类。我们将通过权威数据、经典理论和实际案例,对比分析它们的性能、用法和适用场景,帮助开发者做出明智的选择。
51 0
|
8月前
|
Java
Java并发编程:深入理解synchronized与ReentrantLock
【6月更文挑战第22天】本文将深入探讨Java并发编程中两个重要的同步机制:synchronized关键字和ReentrantLock类。我们将通过实例分析它们之间的差异,以及在实际应用中如何根据场景选择恰当的同步工具。
|
7月前
|
安全 Java 开发者
Java多线程:synchronized关键字和ReentrantLock的区别,为什么我们可能需要使用ReentrantLock而不是synchronized?
Java多线程:synchronized关键字和ReentrantLock的区别,为什么我们可能需要使用ReentrantLock而不是synchronized?
77 0
|
9月前
synchronized与ReentrantLock区别与联系
synchronized与ReentrantLock区别与联系
45 0
ReentrantLock和Synchronized简单比较
ReentrantLock和Synchronized简单比较
58 0
|
Java 程序员
在Synchronized和ReentrantLock之间选择
在Synchronized和ReentrantLock之间选择
54 0
|
程序员
ReentrantLock与synchronized的区别
ReentrantLock与synchronized的区别