浅谈Java并发编程系列(五)—— ReentrantLock VS synchronized

发布时间:2019-11-18 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了浅谈Java并发编程系列(五)—— ReentrantLock VS synchronized脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

ReentrantLock是Java并发包中一个非常有用的组件,一些并发集合类也是用ReentrantLock实现,包括ConcurrentHashMap。ReentrantLock具有三个特性:等待可中断、可实现公平锁、以及锁可以绑定多个条件。

Java中的ReentrantLock

ReentrantLock与synchronized关键字一样,属于互斥锁,synchronized中的锁是非公平的(公平锁是指多个线程等待同一个锁时,必须按照申请锁的时间顺序来依次获得锁),ReentrantLock默认情况下也是非公平的,但可以通过带布尔值的构造函数要求使用公平锁。线程通过ReentrantLock的lock()方法获得锁,用unlock()方法释放锁。

ReentrantLock和synchronized关键字的区别

  1. ReentrantLock在等待锁时可以使用lockInterruptibly()方法选择中断, 改为处理其他事情,而synchronized关键字,线程需要一直等待下去。同样的,tryLock()方法可以设置超时时间,用于在超时时间内一直获取不到锁时进行中断。

  2. ReentrantLock可以实现公平锁,而synchronized的锁是非公平的。

  3. ReentrantLock拥有方便的方法用于获取正在等待锁的线程。

  4. ReentrantLock可以同时绑定多个CondITion对象,而synchronized中,锁对象的wait()和notify()或notifyAll()方法可以实现一个隐含的条件,如果要和多于一个条件关联时,只能再加一个额外的锁,而ReentrantLock只需要多次调用newCondition方法即可。

性能比较

在JDK1.6之前,ReentrantLock的性能要明显优于synchronized,但是JDK1.6中加入了很多针对锁的优化措施,synchronized和ReentrantLock的性能基本完全持平了。

ReentrantLock缺点

ReentrantLock的主要缺点是方法需要置于try-finally块中,另外,开发人员需要负责获取和释放锁,而开发人员常常忘记在finally中释放锁。

ReentrantLock和synchronized示例

import java.util.concurrent.locks.ReentrantLock; import java.util.LOGging.Level; import java.util.logging.Logger;  /**  * Java PRogram to show, how to use ReentrantLock in Java.  * Reentrant lock is an alternative way of locking  * apart From implicit locking provided by synchronized keyword in Java.  *  * @author  Javin Paul  */ public class ReentrantLockHowto {      private final ReentrantLock lock = new ReentrantLock();     private int count = 0;       //Locking using Lock and ReentrantLock      public int getCount() {         lock.lock();         try {             System.out.println(Thread.currentThread().getName() + " gets Count: " + count);             return count++;         } finally {             lock.unlock();         }      }       //Implicit locking using synchronized keyword      public synchronized int getCountTwo() {             return count++;      }            public static void main(String args[]) {         final Threadtest counter = new ThreadTest();         Thread t1 = new Thread() {              @override             public void run() {                 while (counter.getCount() < 6) {                     try {                         Thread.sleep(100);                     } catch (InterruptedException ex) {                         ex.printStackTrace();                    }                 }             }         };                Thread t2 = new Thread() {              @Override             public void run() {                 while (counter.getCount() < 6) {                     try {                         Thread.sleep(100);                     } catch (InterruptedException ex) {                         ex.printStackTrace();                     }                 }             }         };                t1.start();         t2.start();            } }  Output: Thread-0 gets Count: 0 Thread-1 gets Count: 1 Thread-1 gets Count: 2 Thread-0 gets Count: 3 Thread-1 gets Count: 4 Thread-0 gets Count: 5 Thread-0 gets Count: 6 Thread-1 gets Count: 7 

Read more: http://javarevisited.blogspot...

脚本宝典总结

以上是脚本宝典为你收集整理的浅谈Java并发编程系列(五)—— ReentrantLock VS synchronized全部内容,希望文章能够帮你解决浅谈Java并发编程系列(五)—— ReentrantLock VS synchronized所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。