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()
jdk并发工具包之锁的更多相关文章
- Java 并发工具包 java.util.concurrent 用户指南
1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...
- Java并发编程-并发工具包(java.util.concurrent)使用指南(全)
1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...
- Java 8并发工具包漫游指南
Java 8并发工具包简介 Java 8并发工具包由3个包组成,分别是java.util.concurrent.java.util.concurrent.atomic和java.util.concur ...
- Java_并发工具包 java.util.concurrent 用户指南(转)
译序 本指南根据 Jakob Jenkov 最新博客翻译,请随时关注博客更新:http://tutorials.jenkov.com/java-util-concurrent/index.html.本 ...
- Java并发机制及锁的实现原理
同步的基本思想 为了保证共享数据在同一时刻只被一个线程使用,我们有一种很简单的实现思想,就是 在共享数据里保存一个锁 ,当没有线程访问时,锁是空的. 当有第一个线程访问时,就 在锁里保存这个线程的标识 ...
- Java多线程(五) —— 线程并发库之锁机制
参考文献: http://www.blogjava.net/xylz/archive/2010/07/08/325587.html 一.Lock与ReentrantLock 前面的章节主要谈谈原子操作 ...
- Java进阶7并发优化4——JDK并发数据结构
Java进阶7并发优化4——JDK并发数据结构20131114 由于并发程序和串行程序的不同特点,在串行程序中使用的数据结构可能无法在并行程序中直接的正常使用,因为这些数据结构可能不是线程安全的,所以 ...
- Java 并发工具包 java.util.concurrent 用户指南(转)
本文转自http://blog.csdn.net/defonds/article/details/44021605/ 感谢作者 1. java.util.concurrent - Java 并发工具包 ...
- Java 并发工具包 java.util.concurrent 大全
1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...
随机推荐
- 线程池基础 ThreadPool基础
原文发布时间为:2010-10-27 -- 来源于本人的百度文章 [由搬家工具导入] 池(Pool)是一个很常见的提高性能的方式。比如线程池连接池等,之所以有这些池是因为线程和数据库连接的创建和关闭是 ...
- centOS 7 安装java sdk 并测试是否安装成功
CentOS 6.X 和 7.X 自带有OpenJDK runtime environment (openjdk).它是一个在linux上实现开源的Java 平台. 安装方式: 1.输入以下命令,以 ...
- EOJ Monthly 2018.2
A. 坑爹的售票机 题意 用\(1,5,10,25,50,100\)的纸币买\(n\)张单价为\(p\)的船票,且一次性最多买\(k\)张,求钱数恰好时最少需要多少张纸币. Hard: \(n,k,p ...
- 【Visual Studio】error c4996: 'fopen': This function or variable may be unsafe(转)
原文转自 http://blog.csdn.net/zhangyuehuan/article/details/12012635 [解决方案]项目 =>属性 =>c/c++ =>预处 ...
- RecyclerView的Item和Item内的控件点击处理
需求场景:RecyclerView的Item需要点击,或者Item中的某个控件需要点击,或者两者同时需要点击处理. 一.adapter代码如下: package com.ldw.adapter; im ...
- 牛客网 牛客小白月赛1 E.圆与三角形-公式题
E.圆与三角形 链接:https://www.nowcoder.com/acm/contest/85/E来源:牛客网 这个题把公式推一下, 发现就是1+sinA*r,sinA最大为1,所以 ...
- 输出n行等腰三角形(符号为*)
输出n行等腰三角形(符号为*) 1. 核心操作 First, 找出每一行的第一个*之前需要的空格个数 规律1:设该等腰三角形一共N行, 那么第n行的第一个*之前需要的空格个数就为N-n个空格 推导过程 ...
- ios编程规范
允许使用较长的描述尽量不要使用缩写,而是将完整的意思写出来.源于代码的维护可能会被不同文化背景的programmer阅读 适当的命名前缀,比如给变量,协议等,不要给方法加前缀 方法命名规则一般以小写字 ...
- 【spring boot】10.spring boot下的单元测试
spring boot下的单元测试,思前想后还是需要单独用一章篇幅来看看. 然后在看了介绍和使用时候,我感觉并不想多去看了. 但是还是给后来人留下参考的路径: 官网说明:https://spring. ...
- docker入门小结(一)
入职需要学习docker,记录学习随笔.争取两天大致看完docker学习.博客也算是迁移到cnblogs. 学习的链接参考<docker从入门到实践>http://dockerpool.c ...