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()

  

jdk并发工具包之锁的更多相关文章

  1. Java 并发工具包 java.util.concurrent 用户指南

    1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...

  2. Java并发编程-并发工具包(java.util.concurrent)使用指南(全)

    1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...

  3. Java 8并发工具包漫游指南

    Java 8并发工具包简介 Java 8并发工具包由3个包组成,分别是java.util.concurrent.java.util.concurrent.atomic和java.util.concur ...

  4. Java_并发工具包 java.util.concurrent 用户指南(转)

    译序 本指南根据 Jakob Jenkov 最新博客翻译,请随时关注博客更新:http://tutorials.jenkov.com/java-util-concurrent/index.html.本 ...

  5. Java并发机制及锁的实现原理

    同步的基本思想 为了保证共享数据在同一时刻只被一个线程使用,我们有一种很简单的实现思想,就是 在共享数据里保存一个锁 ,当没有线程访问时,锁是空的. 当有第一个线程访问时,就 在锁里保存这个线程的标识 ...

  6. Java多线程(五) —— 线程并发库之锁机制

    参考文献: http://www.blogjava.net/xylz/archive/2010/07/08/325587.html 一.Lock与ReentrantLock 前面的章节主要谈谈原子操作 ...

  7. Java进阶7并发优化4——JDK并发数据结构

    Java进阶7并发优化4——JDK并发数据结构20131114 由于并发程序和串行程序的不同特点,在串行程序中使用的数据结构可能无法在并行程序中直接的正常使用,因为这些数据结构可能不是线程安全的,所以 ...

  8. Java 并发工具包 java.util.concurrent 用户指南(转)

    本文转自http://blog.csdn.net/defonds/article/details/44021605/ 感谢作者 1. java.util.concurrent - Java 并发工具包 ...

  9. Java 并发工具包 java.util.concurrent 大全

    1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...

随机推荐

  1. POJ3170 Bzoj1671 [Usaco2005 Dec]Knights of Ni 骑士

    1671: [Usaco2005 Dec]Knights of Ni 骑士 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 281  Solved: 180 ...

  2. 十步优化SQL Server中的数据访问

    原文发布时间为:2011-02-24 -- 来源于本人的百度文章 [由搬家工具导入] 转载:http://tech.it168.com/a2009/1125/814/000000814758_all. ...

  3. WIN8.1安装 .net framework 3.5

    1.虚拟光驱加载安装镜像 2.以管理员权限运行cmd 3.输入以下命令: dism.exe /online /enable-feature /featurename:NetFX3 /Source:X: ...

  4. gpio 預設值

    若 gpio 預設值只寫 pull-down or pull-up or no-pull or keeper, 代表 是 input mode.

  5. Spring积累总结

    1.spring 的优点: 1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很 ...

  6. hdu 5475(打破固定思维OR线段树)

    An easy problem Time Limit: 8000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  7. HDU 1005 Number Sequence【斐波那契数列/循环节找规律/矩阵快速幂/求(A * f(n - 1) + B * f(n - 2)) mod 7】

    Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  8. hdu 3062 Party 2-SAT

    题目链接:HDU - 3062 有n对夫妻被邀请参加一个聚会,因为场地的问题,每对夫妻中只有1人可以列席.在2n 个人中,某些人之间有着很大的矛盾(当然夫妻之间是没有矛盾的),有矛盾的2个人是不会同时 ...

  9. ASIHTTPRequest 类库在iOS 7.0中,会有一些报错警告,需要稍作修改

    1. if ([inputStream streamStatus] == NSStreamEventErrorOccurred) { 修改成: if ([inputStream streamStatu ...

  10. MFC中 创建基于CFormView的文档视图程序

    在MFC中可以创建多种类型的窗口程序,如对话框程序.单文档结构程序(非文档/视图结构).单文档(文档/视图结构)以及多文档视图结构程序等. 在编写一般的小工具时,我们的首选显然是对话框程序,不过基于对 ...