今天刷抖音的时候听到有博主提到了这两个关键词,于是就去搜了一下,嗯是我还没涉猎的jvm和juc,先记下AI给的知识点,也算脑子里有个小印象了。关于这两个关键词的读音,也记下来,毕竟如果要给别人讲的时候如果单词都读的磕磕绊绊错也挺尴尬的,
synchronized
和 ReentrantLock
都是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
是更好的选择。
总的来说,synchronized
和ReentrantLock
各有优势,选择哪一个取决于具体的应用场景和需求。在性能方面,两者差别不大,但在功能上ReentrantLock
提供了更多的控制选项。