JAVA多线程1——ReentrantLock与synchronized的区别和适用场景

来源:互联网 发布:淘宝分销赚钱吗 编辑:程序博客网 时间:2024/05/22 05:27

重入的概念

首先说明可重入锁的概念,即一个线程尝试去获取自己已经持有的锁,可以成功获取,而其他线程不可以获取。这样做的优点简而言之是——递归无阻塞的同步机制。若锁不是可重入的,在子类的同步方法中调用父类的同步方法,会无法第二次获取子对象的锁,导致死锁。接下来开始正题

ReentrantLock的优点

1、ReentarntLock可以添加多个检控条件(condition),但是synchronized只可以添加一个;

2、ReentarntLock可以控制得到锁的顺序(公平锁),也可以和synchronized一样使用非公平锁;

3、ReentarntLock支持获取锁超时(tryLock()方法)以及获取锁响应中断的操作(lockInterruptibly()方法,synchronized不支持。

4、在高争用条件下,ReentarntLock的可伸缩性优于synchronized。

ReentrantLock的缺点

1、必须在finally块中手动释放锁;

何时应该使用ReentrantLock?

“既然如此,我们什么时候才应该使用 ReentrantLock 呢?答案非常简单 —— 在确实需要一些 synchronized 所没有的特性的时候,比如时间锁等候、可中断锁等候、无块结构锁、多个条件变量或者锁投票。 ReentrantLock 还具有可伸缩性的好处,应当在高度争用的情况下使用它,但是请记住,大多数 synchronized 块几乎从来没有出现过争用,所以可以把高度争用放在一边。我建议用 synchronized 开发,直到确实证明 synchronized 不合适,而不要仅仅是假设如果使用 ReentrantLock “性能会更好”。请记住,这些是供高级用户使用的高级工具。(而且,真正的高级用户喜欢选择能够找到的最简单工具,直到他们认为简单的工具不适用为止。)一如既往,首先要把事情做好,然后再考虑是不是有必要做得更快。”

——该段引自IBM的一篇文章