博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java并发--同步锁Lock
阅读量:2444 次
发布时间:2019-05-10

本文共 2167 字,大约阅读时间需要 7 分钟。

Lock接口

在Java1.5之后,并发包中新增了Lock接口(以及相关实现类)用来实现锁功能,它提供了与synchronized关键字类似的同步功能,只是在使用时需要显示地获取和释放锁。虽然它缺少了(通过synchronized块或者方法所提供的)隐式获取释放锁的便捷性,但是却拥有了锁获取与释放的可操作性、可中断的获取锁以及超时获取锁等多种synchronized关键字所不具备的同步特性。

Lock的使用非常简单。如下所示:

Lock lock = new ReentrantLock();lock.lock();try{
}finally{
lock.unlock();}

在finally块中释放锁,目的是保证在获取到锁之后,最终能够被释放。

不要将获取锁的过程写在try块中,因为如果在获取锁(自定义的实现)时发生了异常,异常抛出的同时,也会导致锁无故释放!

Lock接口提供的synchronized关键字所具备的主要特性如下:

特性 描述
尝试非阻塞地获取锁 当前线程尝试获取锁,如果这一时刻没有被其他线程获取到,则成功获取并持有锁
能被中断地获取锁 与synchronized不同,获取到锁的线程能够响应中断,当获取到锁的线程被中断时,中断异常将会被抛出,同时锁会释放
超时获取锁 在指定的截止时间之前获取锁,如果截止时间到了仍旧无法获取锁,则返回

Lock接口的API:

方法 描述
void lock() 获取锁,调用该方法当前线程将会获取锁,当锁获取后,从该方法返回
void lockInterruptibly() throws InterruptedException 可中断地获取锁,和lock方法的不同之处在于该方法会响应中断,即在锁的获取中可以中断当前线程
boolean tryLock() 尝试非阻塞的获取锁,调用该方法后立刻返回,如果能够获取则返回true,否则返回false
boolean tryLock(long time, TimeUnit unit) throws InterruptedException 超时的获取锁,当前线程在以下3种情况下会返回:
1. 当前线程在超时时间内获得了锁
2. 当前线程在超时时间内被中断
3. 超时时间结束,返回false
void unlock() 释放锁
Condition new Condition() 获取等待通知组件,该组件和当前线程的锁绑定,当前线程只有获得了锁,才能调用该组件的wait()方法,而调用后,当前线程将释放锁

模拟一个简单的抢票案例

package pers.zhang.juc.part1;import sun.security.krb5.internal.Ticket;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * @author zhang * @date 2020/1/17 - 19:54 */public class TestLock {
public static void main(String[] args) {
TrainTicket ticket = new TrainTicket(); new Thread(ticket, "1号窗口").start(); new Thread(ticket, "2号窗口").start(); new Thread(ticket, "3号窗口").start(); }}class TrainTicket implements Runnable{
private int tick = 100; private Lock lock = new ReentrantLock();//Lock的实现类 @Override public void run() {
while(true){
lock.lock(); //上锁 try{
if(tick > 0){
try {
Thread.sleep(200); } catch (InterruptedException e) {
} System.out.println(Thread.currentThread().getName() + " 完成售票,余票为:" + --tick); } }finally{
lock.unlock(); //释放锁 } } }}

转载地址:http://pypqb.baihongyu.com/

你可能感兴趣的文章
css 垂直对齐_CSS垂直对齐属性
查看>>
为您的网站提供动力的100种Jamstack工具,API和服务
查看>>
api restful_构建RESTful API的13种最佳实践
查看>>
wordpress用途_8个热门WordPress多用途主题及其炫酷功能
查看>>
用于Angular,React和Vue.js的Bootstrap UI库
查看>>
使用MongoDB Stitch在10分钟内构建一个Slack应用
查看>>
struts2 css失效_CSS体系结构和可维护CSS的三大Struts
查看>>
php使用nginx建网站_如何使用预建网站来刷新网站的外观
查看>>
使用React和PHP开发游戏:它们的兼容性如何?
查看>>
哈巴狗入门指南
查看>>
js设置css自定义变量_CSS变量实用指南(自定义属性)
查看>>
http建立个人服务器工具_建立网站和页面的最佳7种工具
查看>>
前端框架浏览器兼容解决方案_前端框架:定制与即用型解决方案
查看>>
驯服Snoo:使用Reddit API
查看>>
php页面不渲染显示源代码_PHP如何执行-从源代码到渲染
查看>>
Sourcehunt 17.1:值得关注的7个有趣PHP软件包
查看>>
使用转发装饰器实现模块化架构
查看>>
旅行者 问题_旅行者-管理员UI可以使Laravel更加平易近人吗?
查看>>
口才配置_快速提示:口才观察者的便捷魔力
查看>>
git 应用程序本身更新_如何使用Git通过SFTP正确部署Web应用程序
查看>>