XC
XC
Published on 2024-11-29 / 9 Visits
0
0

synchronized和ReentrantLock

今天刷抖音的时候听到有博主提到了这两个关键词,于是就去搜了一下,嗯是我还没涉猎的jvm和juc,先记下AI给的知识点,也算脑子里有个小印象了。关于这两个关键词的读音,也记下来,毕竟如果要给别人讲的时候如果单词都读的磕磕绊绊错也挺尴尬的,

synchronized / ReentrantLock

synchronizedReentrantLock 都是Java中用于实现线程同步的手段,它们都可以用来确保多个线程在访问共享资源时能够保持一致性和线程安全。不过,它们之间还是存在一些差异和各自的使用场景:

synchronized

  • 内置锁synchronized 是Java语言的关键字,是JVM层面的实现,不需要显式创建锁。

  • 使用简便:使用synchronized关键字可以很方便地实现同步代码块或同步方法。

  • 不可中断:当一个线程持有synchronized锁时,其他线程无法中断它,除非使用Thread.interrupt()方法。

  • 不可选择性synchronized锁不能选择多个条件变量,只能使用一个隐含的条件变量。

  • 不可超时synchronized锁的获取是阻塞的,不能设置超时时间。

  • 可重入synchronized锁也是可重入的,同一个线程可以多次获取同一把锁。

ReentrantLock

  • 显式锁ReentrantLock 是java.util.concurrent.locks包中的一个类,需要显式创建和使用。

  • 灵活性:提供了比synchronized更灵活的锁定机制,例如可以尝试非阻塞地获取锁(tryLock()方法),可以设置超时获取锁(tryLock(long timeout, TimeUnit unit)方法),以及可以中断锁的获取(lockInterruptibly()方法)。

  • 可中断:当一个线程在尝试获取ReentrantLock时,可以通过调用当前线程的interrupt()方法来中断它。

  • 可选择性ReentrantLock可以与多个Condition条件变量配合使用,提供了更复杂的线程间同步控制。

  • 可超时ReentrantLock提供了超时获取锁的能力,这对于避免死锁非常有用。

  • 可重入ReentrantLock也是可重入的,同一个线程可以多次获取同一把锁。

使用场景

  • 当需要快速方便地实现同步时,可以使用synchronized

  • 当需要更细粒度的控制时,比如尝试获取锁、定时锁和可中断锁等,可以使用ReentrantLock

  • 对于需要与多个Condition条件变量配合的场景,ReentrantLock是更好的选择。

总的来说,synchronizedReentrantLock各有优势,选择哪一个取决于具体的应用场景和需求。在性能方面,两者差别不大,但在功能上ReentrantLock提供了更多的控制选项。


Comment