Java并发编程之显式锁(Lock)使用
又是一个基于AQS好用的类,看来下次有必要看看AQS了,正好又是放假。
既然叫显式锁,必然也有隐式锁,也就是所谓的synchronzied关键字,它们两者的区别呢在于使用范围,synchronzied关键字的使用范围比Lock要小,在Lock的实现类中与synchronzied相近似的类叫ReentrantLock,也叫可重入锁,待会儿在说看看Lock吧
Lock
是一个接口,主要的实现类有三个 ReadLock(写锁),WriteLock(读锁),ReentrantLock(可重入锁)
核心方法:
1、lock():获取锁并上锁。
2、unlock():释放锁,未释放会造成阻塞,一般放在程序的finally代码块中。
3、tryLock():尝试的获取锁,带参数的为超时尝试获取锁。
4、newCondition():获取到Condition接口的实现类,用于配合Lock实现等待通知功能,每调用一次就获取一个新的Condition,并非只有一个。
5、 lockInterruptibly():获取锁但是可以中断这个锁。
使用示例:
static Lock lock = new ReentrantLock();
static int count = 0;public static void main(String [] arg0){lock.lock();//获取锁try{count ++ ;}finally{lock.unlock();//释放锁}}
//该示例就做一个统计吧
可重入锁(ReentrantLock)
就是可以重复获取锁,但是这种一般出现于递归算法,重复获取了多少次锁就会释放多少次锁。
看一个案例:
static Lock lock = new ReentrantLock();static int count = 0;public synchronized static void addIntger() {count ++;while(count<10) {addIntger();//可重入锁}}public static void addLockIntger() {lock.lock();try {count ++;while(count<10) {addLockIntger();//可重入锁}} finally {lock.unlock();}}public static void main(String[] args) {System.out.println(count);addLockIntger();System.out.println(count);}
公平锁和非公平锁
公平锁(new FairSync()):即同一时刻去多个线程请求锁,先到先得,排队获取锁即为公平锁,未获取到锁的线程会被挂起(非阻塞等待,是会进入到AQS的尾队列等待,跟非公平锁比,耗时就是花费在这里),等到锁释放后按照顺序获取锁,所以与非公平锁相比,更耗时。
非公平锁(new NonfairSync()):即同一时刻多个线程去请求锁,不是按照先到先的顺序获取锁即为非公平锁,无需进入AQS队列等待,运行速度更快,创建Lock对象默认为非公平锁。
这两种锁都继承了AQS(不得不说Doug Lea大师的强大),公平锁适合在按顺序执行的场景。
读写锁(ReadWriteLock)
ReadWriteLock并没有继承Lock接口,而是在它的实现类中ReentrantReadWriteLock有两个内部类却继承了Lock接口,即为ReadLock和WriteLock,这两均实现了AQS抽象类。
这个种锁使用的场景为读多写少的场景,在获取写锁时,读写锁都会进入阻塞状态,而获取读锁并不会进入阻塞状态。
public interface ReadWriteLock {/*** Returns the lock used for reading.** @return the lock used for reading*/Lock readLock();/*** Returns the lock used for writing.** @return the lock used for writing*/Lock writeLock();
}
Condition
可以配合Lock使用等待通知模式,这里就不演示啦,与之前的wait()和notify/notifyAll()相近似,看一下这个接口中的方法定义:
1、await():类似于Object的wait()等待。
2、awaitUninterruptibly():这个表示等待不可中断,其他的等待都可以被中断。
3、awaitNanos(long):超时等待。
4、awaitUntil(Date):可指定时间超时等待,与上面几种超时方法差不多。
5、signal():类似与Object中的notify()。
6、signalAll():类似与Object中的notifyAll()。
LockSupport
是Lock的支持类,里面都是静态方法
主要是用来阻塞、唤醒一个线程
1、park():阻塞当前线程
2、unpark(Thread t):唤醒指定线程
park也有其他带参数的方法,基本都是不同形式的超时等待方法。
好啦差不多就这样了,Lock的用途还是挺广泛的,在很多开源包都能看见这个的身影,比如阿里的Druid连接池中就用到了。写的并不是很好,各路大佬可以在评论里面补充咯
Java并发编程之显式锁(Lock)使用相关推荐
- java 显示锁_Java 实现一个自己的显式锁Lock(有超时功能)
Lock接口 package concurency.chapter9; import java.util.Collection; public interface Lock { static clas ...
- JUC里面的相关分类|| java并发编程中,关于锁的实现方式有两种synchronized ,Lock || Lock——ReentrantLock||AQS(抽象队列同步器)
JUC分类 java并发编程中,关于锁的实现方式有两种synchronized ,Lock AQS--AbstractQueuedSynchronizer
- Java并发编程实战之互斥锁
文章目录 Java并发编程实战之互斥锁 如何解决原子性问题? 锁模型 Java synchronized 关键字 Java synchronized 关键字 只能解决原子性问题? 如何正确使用Java ...
- 显式锁Lock的集大成之作,最细节教程
显式锁是什么? 我们一般喊synchronized就叫synchronized.其实synchronized又被称为隐式锁,但我们就爱喊它synchronized.而显式锁就是我们一般说的Lock锁, ...
- reentrantlock非公平锁不会随机挂起线程?_【原创】Java并发编程系列16 | 公平锁与非公平锁...
本文为何适原创并发编程系列第 16 篇,文末有本系列文章汇总. 上一篇提到重入锁 ReentrantLock 支持两种锁,公平锁与非公平锁.那么这篇文章就来介绍一下公平锁与非公平锁. 为什么需要公平锁 ...
- **Java有哪些悲观锁的实现_「Java并发编程」何谓悲观锁与乐观锁,Java编程你会吗...
何谓悲观锁与乐观锁 悲观锁 乐观锁 两种锁的使用场景 乐观锁常见的两种实现方式 1. 版本号机制 2. CAS算法 乐观锁的缺点 1 ABA 问题 2 循环时间长开销大 3 只能保证一个共享变量的原子 ...
- java 显式锁_Java 实现一个自己的显式锁Lock(有超时功能)
Lock接口 package concurency.chapter9; import java.util.Collection; public interface Lock { static clas ...
- Java并发编程(05):悲观锁和乐观锁机制
本文源码:GitHub·点这里 || GitEE·点这里 一.资源和加锁 1.场景描述 多线程并发访问同一个资源问题,假如线程A获取变量之后修改变量值,线程C在此时也获取变量值并且修改,两个线程同时并 ...
- Java并发编程学习四:锁
一.锁的分类 Java中有着各种各样的锁,对于锁的分类也是多种多样,一把锁可能同时占有多个标准,符合多种分类. 对锁的常见分类有以下几个标准: 1. 偏向锁/轻量级锁/重量级锁 这三种锁特指 sync ...
最新文章
- js面试题知识点全解(一作用域)
- 为什么会出现 java.util.ConcurrentModificationException 异常?
- 深入Atlas系列:综合示例(1) - 调用服务器端方法时直接获得客户端具体类型...
- 建立网络安全新生态,网络态势感知至关重要
- [github高级控件] 带你走近 - CircleIndicator指示器原点动画切换
- TSC打印bmp图片命令
- matlab矩阵排序sort,MATLAB数组元素的排序
- 你来分我先选 原则
- 计算机窗口弹出多个窗口,电脑怎么打开多个微信窗口
- unity四种Text总结
- NAT转换技术(SNAT、MASQUERADE、DNAT策略)及代理服务(squid服务)
- uoj198【CTSC2016】时空旅行
- 字符串截取字符串截取,substring
- JS中将中文数字转化为阿拉伯数字
- 深度学习 机器学习基础_实用的机器学习基础
- 学Java的逻辑测试题_面试中的逻辑题测试及答案.doc
- Youtube的个人视频门户:Portal:Youtube director
- 三星文档html删除吗,HTML5新增标签和删除的标签
- vue-element-admin安装运行是英文界面调整为中文
- (介孔sio2) 介孔二氧化硅微球的应用
热门文章
- mysql-5.5.56配置_mysql 5.5.56免安装版配置方法
- ZOJ 3804 YY's Minions (简单模拟)
- 2.2线性表的顺序表
- 爱特php文件管理器2.8_查找「超级蜘蛛池开发者中心 抠:44564876易」安卓应用 - 豌豆荚...
- 怎么用python编程前二n-1项的等差数列的和_python 等差数列末项计算方式
- 鸿蒙系统年底问世视频,鸿蒙系统年底问世 什么时候上市使用
- phpmyadmin 导出mysql,在phpmyadmin中导入/导出非常大的mysql数据库
- mysql高级查询教程_MYSQL高级查询
- 初识Hadoop:大数据与Hadoop概述
- Linux Vi的使用