Java多线程与并发原理 --- synchronized 与 ReentrantLock 的区别

synchronized 与 ReentrantLock 的区别?

ReentrantLock (再入锁)

1、位于 java.util.concurrent.locks 包

2、和CountDownLatch 、FuntureTask、Semaphore 一样基于AQS 实现。

3、能够实现比Synchronized 更细粒度的控制,如控制fairness。

4、调用lock()之后,必须调用unlock()释放锁。

5、性能未必比synchronized 高。并且也是可重入的。

ReentrantLock 公平性设置

1、ReentrantLock lock = new ReentrantLock(true);

2、当true 倾向于将锁赋予等待时间最久的线程。

3、公平锁:获取锁的顺序安装先后调用lock方法的顺序(慎用);

4、非公平锁:抢占的顺序不一定,看运气。

5、synchronized 是非公平锁。

Java多线程与并发原理 --- synchronized 与 ReentrantLock 的区别

ReentrantLock 将锁对象化

1、判断是否有线程,或者将某个特定线程,在排队获取锁。

2、带超时的获取锁的尝试。

3、感知有没有成功获取锁。

是否能将 wait / notify / notifyAll 对象化?

1、java.util.concurrent.locks.Condition

总结:

1、synchronized 是关键字 ,ReentrantLock 是类。

2、因为 ReentrantLock 是类所以提供了比 synchronized 更多更灵活的方案。可以被继承,可以有方法。可以有各种各样的类变量。

3、ReentrantLock 可以对获取锁的等待时间设置,避免死锁。

4、ReentrantLock 可以获取各种锁的信息。

5、ReentrantLock 可以灵活的实现多路通知。

6、二者的锁机制也是不一样的。sync 操作 Mark word ,lock 调用 Unsafe 类的 park () 方法。