synchronized
和 ReentrantLock
都可以用于实现线程同步,二者之间有以下区别:
- 可重入性:
ReentrantLock
是可重入的锁,即同一个线程可以多次获得同一个锁,而synchronized
是非可重入的锁。如果一个线程已经获得了一个synchronized
锁,那么它必须先释放这个锁才能再次获得它。 - 可中断性:
ReentrantLock
提供了可中断的获取锁的机制,可以让等待的线程在等待期间可以被中断并返回,而synchronized
是不可中断的。 - 公平性:
ReentrantLock
可以设置公平锁或非公平锁,而synchronized
是非公平锁。 - 粒度:
synchronized
锁的粒度是整个方法或者代码块,而ReentrantLock
锁的粒度可以细化到单个数据结构或变量的级别。 - 性能:在低并发的情况下,
synchronized
的性能表现更好,而在高并发的情况下,ReentrantLock
的性能表现更好。
综上所述,当需要实现线程同步时,可以优先选择使用 synchronized
关键字,因为它简单易用,并且性能表现在低并发情况下更好。而当需要更加灵活的同步控制时,可以选择使用 ReentrantLock
,它提供了更多的特性,如可重入性、可中断性和公平性,能够更好地适应不同的场景需求。