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();
            // }
        }

    }
}

}
结果为:

目录
相关文章
|
1月前
|
存储 Java 程序员
synchronized的原理以及与ReentrantLock的区别
`synchronized`和`ReentrantLock`均为Java线程同步机制,确保共享资源的单一时刻独占访问。`synchronized`关键字直接嵌入JVM,可通过修饰方法或代码块实现对象锁或监视器锁,具备可重入性,依赖Mark Word进行锁状态管理。`ReentrantLock`则需显式调用`lock()`和`unlock()`,提供更灵活控制,如公平锁、尝试锁及条件变量。两者在语法、灵活性和异常处理上有所差异,但均支持可重入性。性能方面,随JDK优化,`synchronized`在某些场景下甚至优于`ReentrantLock`。选择使用哪个取决于具体需求和上下文。
|
2月前
|
安全 Java 开发者
Java多线程:synchronized关键字和ReentrantLock的区别,为什么我们可能需要使用ReentrantLock而不是synchronized?
Java多线程:synchronized关键字和ReentrantLock的区别,为什么我们可能需要使用ReentrantLock而不是synchronized?
35 0
|
4月前
synchronized与ReentrantLock区别与联系
synchronized与ReentrantLock区别与联系
35 0
|
11月前
ReentrantLock和Synchronized简单比较
ReentrantLock和Synchronized简单比较
38 0
|
12月前
Synchronized
作用:能够保证在同一时刻最多有一个线程执行该段代码,以保证并发的安全性。(当第一个线程去执行该段代码的时候就拿到锁,并独占这把锁,当方法执行结束或者一定条件后它才释放这把锁,在没释放锁之前,所有的线程处于等待状态)
54 0
|
程序员
ReentrantLock与synchronized的区别
ReentrantLock与synchronized的区别
|
存储 缓存 安全
synchronized的简单理解
synchronized的简单理解
82 0
|
Java API 调度
synchronized 和 ReentrantLock 的实现原理是什么?它们有什么区别
synchronized 和 ReentrantLock 的实现原理是什么?它们有什么区别
71 0
|
算法 Java
【JUC基础】05. Synchronized和ReentrantLock
前面两篇中分别讲了Synchronized和ReentrantLock。两种方式都能实现同步锁,且也都能解决多线程的并发问题。那么这两个有什么区别呢? 这个也是一个高频的面经题。
103 0