码迷,mamicode.com
首页 > 编程语言 > 详细

java架构《并发线程高级篇四》

时间:2017-05-17 13:48:48      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:signal   iter   加锁   读写分离   public   try   优先   代码加锁   catch   

    本章主要讲并发线程的常见的两种锁。重入锁和读写锁

 

一:重入锁(ReentrantLock)

    概念:重入锁,在需要进行同步的代码加锁,但最后一定不要忘记释放锁,否则会造成锁永远不能释放,其他线程进不了

    代码解析:

        实例化:Lock lock = new ReentrantLock();

        锁定:lock .lock();

        释放锁:lock.unlock();

 

    代码:

        

      private Lock lock = new ReentrantLock();

      public void method1(){
          try {
            lock.lock();
            System.out.println("当前线程:" + Thread.currentThread().getName() + "进入method1..");
            Thread.sleep(1000);
            System.out.println("当前线程:" + Thread.currentThread().getName() + "退出method1..");
            Thread.sleep(1000);
            } catch (InterruptedException e) {
              e.printStackTrace();
            } finally {

            lock.unlock();
          }
        }

 

    Condition类:配合重入锁,阻塞和通知,不需要配合synchronized使用,比较灵活,支持多个线程锁定,同时通知全部。

          阻塞和通知:

          private Lock lock = new ReentrantLock();

          private Condition condition = lock.newCondition();

          阻塞:condition.await();    

          通知:condition.signal(); 

           通知全部:condition.signalall()

   Lock/Condition其他方法和用法:

        Lock lock=new  ReentrantLock(boolean isFair);

            tryLock():尝试获得锁,返回false/true

            tryLock():在给定的时间内尝试获得锁,获得结果用 true/false表示。

            isFair():返回是否是公平锁  true/false

            isLocked():返回是否锁定

            getHoldCount():返回当前线程保持此锁的个数,或者说表示调用了lock()的次数

            lockinterruptibly():优先响应中断的锁

            getQueueLength():返回正在等待获取此锁定的线程数。 

            getWaitQueueLength():返回等待与锁定相关的给定条件Condition的线程数

            hasQueueThread(Thread t):查询指定的线程是否正在等待此锁

            hasQueueThreads():查询是否有线程正在等待此锁

            hasWaiters():查询是否有线程正在等待与此锁定有关的condition条件

 

 

二:读写锁(ReentrantReadWriteLock)

     概念:其核心就是读写分离的锁,在读多写少情况下,性能远高于重入锁 。口诀:读读共享,写写互斥,读写互斥

     代码解析:

        实例化:       

          private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
          private ReadLock readLock = rwLock.readLock();  //获取到读锁
          private WriteLock writeLock = rwLock.writeLock();  //获取到写锁

 

 

        

    

java架构《并发线程高级篇四》

标签:signal   iter   加锁   读写分离   public   try   优先   代码加锁   catch   

原文地址:http://www.cnblogs.com/coes/p/6866776.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!