码迷,mamicode.com
首页 > 其他好文 > 详细

jdk并发工具包之锁

时间:2017-09-09 00:04:41      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:sync   占用   必须   算法   实现   false   boolean   相同   时间   

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一致,但是不会相应中断;

 

 

 

  

jdk并发工具包之锁

标签:sync   占用   必须   算法   实现   false   boolean   相同   时间   

原文地址:http://www.cnblogs.com/lmjk/p/7496759.html

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