zoukankan      html  css  js  c++  java
  • java架构《并发线程高级篇四》

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

    一:重入锁(ReentrantLock)

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

        代码解析:

    1         实例化:Lock lock = new ReentrantLock();
    2 
    3         锁定:lock .lock();
    4 
    5         释放锁:lock.unlock();

        代码:

            

          

     1 private Lock lock = new ReentrantLock();
     2 
     3       public void method1(){
     4           try {
     5             lock.lock();
     6             System.out.println("当前线程:" + Thread.currentThread().getName() + "进入method1..");
     7             Thread.sleep(1000);
     8             System.out.println("当前线程:" + Thread.currentThread().getName() + "退出method1..");
     9             Thread.sleep(1000);
    10             } catch (InterruptedException e) {
    11               e.printStackTrace();
    12             } finally {
    13 
    14             lock.unlock();
    15           }
    16         }

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

              阻塞和通知:

             

    1                 private Lock lock = new ReentrantLock();
    2 
    3           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();  //获取到写锁

            

        

  • 相关阅读:
    Compiler Warning C4150: deletion of pointer to incomplete type 'XXX'; no destructor called
    What happend: Exception throws in the .ctor()?
    FocusScope学习一: Logic Focus与Keyboard Focus
    线性筛prime,强大O(n)
    网络流24题方格取数
    splay(1区间翻转区间最值与区间修改)
    排列组合容斥原理
    错排思路
    splay2(区间修改+内存回收)
    DP_1d1d诗人小G
  • 原文地址:https://www.cnblogs.com/coes/p/6866776.html
Copyright © 2011-2022 走看看