• jdk并发工具包之锁


    1、cynchronized扩展:可重锁入ReentrantLock

      ReentrantLock是通过cas算法实现的

      RenntrantLock lock=new ReentrantLock();

      lock.lock();//如果资源被占用则会等待

      //代码锁定区域

      finally{

      //必须手动解锁

      lock.unlock();

      }

         (1)中断锁

      ReentrantLock 提供了可中断锁lockInterruptibly

      lock.lockInterruptibly();//会获得锁,但是会优先相应中断

      lock.unlock();

     当当前线程终端会释放锁

     (2)显示等待锁tryLock();

      tryLock()会申请锁,如果无法获得锁,将返回false

      tryLock也可以设置尝试一段时间获取锁

     (3)公平锁 fair

      在创建ReentrantLock的时候,有一个构造方法ReentrantLock(boolean fair);默认为false,如果传入true则表示使用公平锁

     2、Condition

      Condition是搭配ReentrantLock搭配使用的,用于控制当前ReentrantLock锁是否释放,是否被唤起。

      ReentrantLock lock=new ReentrantLock();

      Condition condition=lock.newCondition();

      lock.lock();

      condition.await()//会立即释放lock,进入等待状态,直到signal或者signalAll唤醒;

      //condition.awaitUninteruptily();用法与await基本相同,但是不会在等待过程中响应中断

      //锁定代码

      finally

      lock.unlock

     3、信号量Semaphone,允许多个线程同时访问

      ReentrantLock和synchronized锁定之后,至允许一个线程访问,而Semaphone是允许多个线程同时访问;

      Semaphone(int permits)//permits为许可数量,允许同时有permits访问

      Semaphone(int permits,boolean fair)//fair表示是否公平

      Semaphone中的主要方法有

      acquire();尝试获得一个许可,如果无法获得,则会等待;

      release();当线程执行完成之后释放一个许可

      tryacquire();尝试获得一个许可,如果获取到返回true;否则返回false;

      tryacqurie(timeout,unit);在制定时间内尝试获得一个许可;

      acquireUninterrupt();用法与acquire一致,但是不会相应中断;

    4、ReadWriteLock读写锁

      ReadWriteLock适用于大量读,少量写的操作

      读与读之间不阻塞,读与写阻塞,写与写阻塞

      ReadWriteLock就是同时只允许有一个线程写,但是多个线程可以同时读,不能一边读一边写。

      ReadWriteLock rwl=new ReadWriteLock();

      Lock readLock=wrl.readLock();

      readLock.lock();

      //代码

      readLock.unlock();

      Lock writeLock=wrl.readLock();

      writeLock.lock();

      //代码

      writeLock.unlock();

     5、CountDownLock 倒计时器

      主要用于控制等待线程,通过CountDownLock(int count);指定计数器个数,表示有count个线程执行完成之后,才能执行当前(main中的)主线程;

      通过await()检查,调用await之后当前线程会等待,知道执行完指定个数的线程;

     6、循环栅栏CyclicBarrier

      CyclicBarrier(int parties,Runable barrierAction) parties为线程数,barrierAction为线程执行完成之后的通知线程

      CyclicBarrier会集合够parties个线程之后,让他们同时执行,执行完成之后通过barrierAction通知。

      CyclicBarrier主要作用是保证parties个线程执行同步,第一次调用await方法会集合线程,第二次调用会await集体执行成功通知barrierAction

      CyclicBarrier栅栏中的某一个线程被中断,会影响其他线程的执行,会抛出BrokenBarrierException。

      问题:当CyclicBarrier中某一个线程执行过程中被中断,其他线程会执行成功吗?

      7、LockSupport线程阻塞工具类

      LockSupport可以让一个线程在任何一个地方中断,功能类似与Thread的supend(挂起不释放锁)和resume(继续执行),Thread中如果resume在supend之前,会导致线程永久挂起,

    使用LockSupport的pack和unpack则不会发生这种情况。LockSupport是使用信号量机制,为每个线程创建了一个许可,及时unpack执行在pack之后,unpack会创建一个许可,pack执行会消耗这个许可,会立即返回。LockSupport被中断之后是不会跑出InterruptedException,但是会同步线程状态,Thread.isInterrupted()

      

  • 相关阅读:
    MSI文件的制作
    QPushButton 响应回车 设置默认按钮
    ubuntu 使用apt-fast 安装软件包
    apt命令集使用教程
    如何在windows下使用git及github仓库管理项目
    如何在windows下使用git及github仓库管理项目
    01. struts2介绍
    人生能跨越多少个年代
    联调踩的坑:空和空字符串引发的巨大差异
    我的亲历:一行代码,百万人民币打水漂
  • 原文地址:https://www.cnblogs.com/lmjk/p/7496759.html
Copyright © 2020-2023  润新知