首页 > 其他分享 >详尽地对比下 Synchronized 和 ReentrantLock 的异同

详尽地对比下 Synchronized 和 ReentrantLock 的异同

时间:2023-08-01 17:06:39浏览次数:30  
标签:内置 Java Synchronized 异同 ReentrantLock 获取 线程

Synchronized和ReentrantLock都是Java中用于实现线程同步的机制,它们的目的都是为了保证多线程环境下的数据安全和正确性,避免竞态条件(Race Condition)的发生。下面详细对比它们的异同:

  1. 锁类型:
  • Synchronized:是Java中的内置锁(Intrinsic Lock),也称为监视器锁(Monitor Lock)。在Java中,每个对象都有一个内置锁,当使用Synchronized关键字修饰方法或代码块时,实际上就是对这个对象的内置锁进行加锁和解锁操作。
  • ReentrantLock:是Java中的显示锁(Explicit Lock),它是java.util.concurrent包中的类,需要显式地使用ReentrantLock对象来进行加锁和解锁。
  1. 获取锁的方式:
  • Synchronized:自动获取锁,当一个线程执行Synchronized修饰的代码块时,会自动获得对象的内置锁,其他线程需要等待锁释放后才能进入。
  • ReentrantLock:需要显式地调用lock()方法来获取锁,并在合适的时机调用unlock()方法释放锁,可以灵活控制锁的获取和释放。
  1. 锁的可重入性:
  • Synchronized:支持可重入性,同一个线程在已经获得某个对象的内置锁时,可以再次获取该对象的内置锁而不会被阻塞。
  • ReentrantLock:同样支持可重入性,一个线程在已经获得ReentrantLock对象锁时,可以再次获取该锁而不会被阻塞,但要注意要对应地释放相同次数的锁。
  1. 等待锁的超时:
  • Synchronized:不支持等待锁的超时设置。
  • ReentrantLock:支持等待锁的超时设置,可以使用tryLock(long timeout, TimeUnit unit)方法来尝试获取锁,在指定的时间内获取不到则放弃。
  1. 锁的公平性:
  • Synchronized:不保证线程获取锁的公平性,即线程在等待锁时没有特定的顺序,可能会导致某些线程一直获取不到锁(饥饿现象)。
  • ReentrantLock:支持公平锁和非公平锁,默认是非公平锁。可以通过构造函数传入true来创建公平锁,即等待时间较长的线程会优先获得锁。
  1. 适用性:
  • Synchronized:简单易用,适用于大部分的同步场景,能满足一般的线程同步需求。
  • ReentrantLock:更灵活且功能更强大,提供了很多高级特性,如可中断的锁获取、公平锁、可重入性的限制等,适用于复杂的同步场景。

总的来说,Synchronized是Java内置的锁机制,使用简单但功能有限,而ReentrantLock是更灵活、功能更强大的显示锁机制,适用于需要更高级功能的同步需求。在选择使用哪种锁机制时,要根据具体的业务场景和性能需求来做出合适的选择。

标签:内置,Java,Synchronized,异同,ReentrantLock,获取,线程
From: https://blog.51cto.com/u_16097317/6924387

相关文章

  • 2、【java线程及线程池系列】synchronized、ReentrantLock和ReentrantReadWriteLock介
    java线程及线程池系列文章1、【java线程及线程池系列】java线程及线程池概念详解2、【java线程及线程池系列】synchronized、ReentrantLock和ReentrantReadWriteLock介绍及示例3、【java线程及线程池系列】线程池ThreadPoolExecutor的类结构、使用方式示例、线程池数量配置原则和......
  • 《面试1v1》synchronized
    源码都背下来了,你给我看这我是javapub,一名Markdown程序员从......
  • 继电器、接触器、断路器、中间继电器的异同点是什么?
    继电器、接触器、断路器和中间继电器都是电力系统中常用的控制元件,它们的作用和功能有一定的相同之处,但也存在一些不同点。相同点:都是控制元件:继电器、接触器、断路器和中间继电器都是用于控制电力系统的元件,可以控制电路的通断、电流的大小和方向等。都可以用于开关控制:继电器......
  • synchronized和Lock的区别
    存在层次上synchronized: Java的关键字,在jvm层面上Lock: 是一个接口 锁的释放synchronized: 1、以获取锁的线程执行完同步代码,释放锁2、线程执行发生异常,jvm会让线程释放锁Lock: 在finally中必须释放锁,不然容易造成线程死锁 锁的获取synchronized: 假设A线程获得......
  • Synchronized关键字同步类方法
    要想解决“脏数据”的问题,最简单的方法就是使用synchronized关键字来使run方法同步,代码如下:publicsynchronizedvoidrun(){}   从上面的代码可以看出,只要在void和public之间加上synchronized关键字,就可以使run方法同步,也就是说,对于同一个Java类的对象实例,run方法......
  • java中synchronized和Lock的区别?
    synchronized和Lock是Java中两种不同的实现线程同步的机制。下面是它们之间的主要区别:可重入性:synchronized是可重入的,同一个线程可以多次获得同一个锁。Lock也是可重入的,同一个线程可以多次获得同一个锁。但需要手动释放相同次数的锁。粒度:synchronized可以用于修饰......
  • synchronized和ReentrantLock的区别
    用法:synchronized修饰代码块或者方法,不需要手动释放,默认非公平ReentrantLock需要手动调用,手动释放,能够控制公平机制,能够尝试获取和超时获取锁,能更好的控制锁行为,在需要通过线程提高性能的场景中,能比较好的操控 基本原理:synchronized是靠管程(monitor)实现的,有锁升级,默认从轻量......
  • 2023-07-14:讲一讲Kafka与RocketMQ中存储设计的异同?
    2023-07-14:讲一讲Kafka与RocketMQ中存储设计的异同?答案2023-07-14:在Kafka中,文件的布局采用了Topic/Partition的方式,每个分区对应一个物理文件夹,且在分区文件级别上实现了顺序写入。然而,当一个Kafka集群拥有大量的主题和每个主题拥有数百个分区时,在高并发写入消息的情况下,IO操作......
  • 2023-07-14:讲一讲Kafka与RocketMQ中存储设计的异同?
    2023-07-14:讲一讲Kafka与RocketMQ中存储设计的异同?答案2023-07-14:在Kafka中,文件的布局采用了Topic/Partition的方式,每个分区对应一个物理文件夹,且在分区文件级别上实现了顺序写入。然而,当一个Kafka集群拥有大量的主题和每个主题拥有数百个分区时,在高并发写入消息的情况下,IO操作会变......
  • JUC 常用类 ReentrantLock
    ReentrantLock类内部总共存在Sync、NonfairSync、FairSync三个类NonfairSync与FairSync类继承自Sync类Sync类继承自AbstractQueuedSynchronizer抽象类内部类SyncabstractstaticclassSyncextendsAbstractQueuedSynchronizer{//序列号private......