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

    }
}

}
结果为:

​

目录
相关文章
|
SQL 关系型数据库 数据库
学习分布式事务Seata看这一篇就够了,建议收藏
学习分布式事务Seata看这一篇就够了,建议收藏
26257 2
|
6月前
|
安全 Java
深入拆解 ReentrantLock:从底层实现到生产最佳实践
本文深入剖析ReentrantLock底层原理,基于AQS框架详解state状态、CLH队列及公平/非公平锁机制;对比synchronized在实现、功能(可中断、多条件变量)和性能上的差异;结合代码演示三类锁适用场景与最佳实践,助你写出高效、健壮的并发程序。
527 4
|
JSON JavaScript Linux
【MCP教程系列】如何自己打包MCP服务并部署到阿里云百炼上
本文章以阿里云百炼的工作流为例,介绍如何将其封装为MCP服务并部署到平台。主要步骤包括:1)使用Node.js和TypeScript搭建MCP服务;2)将项目打包并发布至npm官方平台;3)在阿里云百炼平台创建自定义MCP服务;4)将服务添加到智能体中进行测试。通过这些步骤,您可以轻松实现工作流的MCP化,并在智能体中调用自定义服务。
5375 107
|
存储 缓存 安全
Java集合框架(三):Map体系与ConcurrentHashMap
本文深入解析Java中Map接口体系及其实现类,包括HashMap、ConcurrentHashMap等的工作原理与线程安全机制。内容涵盖哈希冲突解决、扩容策略、并发优化,以及不同Map实现的适用场景,助你掌握高并发编程核心技巧。
|
存储 算法 Java
【令牌桶算法与漏桶算法】
【令牌桶算法与漏桶算法】
1036 0
|
存储 安全 Java
synchronized原理详解(通俗易懂超级好)
当系统检查到锁是重量级锁之后,会把等待想要获得锁的线程进行阻塞,被阻塞的线程不会消耗cpu。但是阻塞或者唤醒一个线程时,都需要操作系统来帮忙,这就需要从用户态转换到内核态,而转换状态是需要消耗很多时间的,有可能比用户执行代码的时间还要长。
synchronized原理详解(通俗易懂超级好)
|
负载均衡 监控 Java
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
34063 8
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
|
Linux 数据库
Linux 常用基础命令(2024年最新篇)新手小白必看 初识Linux
Linux 常用基础命令(2024年最新篇)新手小白必看 初识Linux
6631 1
|
NoSQL Java 数据库
分布式事务的锁
分布式事务的锁
378 0
分布式事务的锁