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 是非公平锁。
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 () 方法。
还没有评论,来说两句吧...