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连接池中就用到了。写的并不是很好,各路大佬可以在评论里面补充咯

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/537175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python pychart三维_详解python模块pychartdir安装及导入问题

在迁移别人写好的脚本时&#xff0c;发现pychartdir没有导入&#xff0c;脚本执行报错。以下是报错内容&#xff1a;[modpsLGJF-ZYC5-MMSC-WEB02 ~]$ python /opt/aspire/product/modps/mopps/shell/dayreport_linux.py/etc/host.conf: line 1: bad command nospoof on"Tr…

vim 中Ctags的安装和使用

Ctags是一个用来为源文件中的标识符&#xff08;如变量、函数、类成员、宏定义等&#xff09;创建索引文件的程序。这些tags文件能被编辑器或其它工具用来快速查找定位源代码中的符号&#xff08;tag/symbol&#xff09;&#xff0c;如变量名&#xff0c;函数名等。 Tags文件中…

Java并发编程之AbstractQueuedSynchronizer(AQS)源码解析

自己一个人随便看看源码学习的心得&#xff0c;分享一下啦&#xff0c;不过我觉得还是建议去买本Java并发编程的书来看会比较好点&#xff0c;毕竟个人的理解有限嘛。 独占锁和共享锁 首先先引入这两个锁的概念&#xff1a;独占锁即同一时刻只有一个线程才能获取到锁&#xf…

采集用python还是火车头_我才知道爬虫也可以酱紫--火车采集器

我才知道爬虫还可以这样—火车采集器的使用说在前面额。。。好吧&#xff0c;我这一个三毛钱的屌丝也开始步入实习阶段了&#xff0c;在北京其实也挺好的&#xff0c;虽说压力大&#xff0c;但是今后就业机会也相对而言大一些。好了&#xff0c;说回今天的主题&#xff0c;之前…

mvn 使用中的错误

出现这种错误的时候&#xff1a;mvn Error building POM may not be this projects POM&#xff0c;报的是那个jar 包&#xff0c;就删除那个jar 包&#xff0c;重新mvn clean install .ok

Java并发编程之FutureTask源码解析

上次总结一下AQS的一些相关知识&#xff0c;这次总结了一下FutureTask的东西&#xff0c;相对于AQS来说简单好多呀 之前提到过一个LockSupport的工具类&#xff0c;也了解一下这个工具类的用法&#xff0c;这里也巩固一下吧 /*** Makes available the permit for the given th…

java 删除二维数组中的null_避免在Java中检查Null语句

1.概述通常&#xff0c;在Java代码中处理null变量、引用和集合很棘手。它们不仅难以识别&#xff0c;而且处理起来也很复杂。事实上&#xff0c;在编译时无法识别处理null的任何错误&#xff0c;会导致运行时NullPointerException。在本教程中&#xff0c;我们将了解在Java中检…

Java并发编程之并发容器ConcurrentHashMap(JDK1.7)解析

最近看了一下ConcurrentHashMap的相关代码&#xff0c;感觉JDK1.7和JDK1.8差别挺大的&#xff0c;这次先看下JDK1.7是怎么实现的吧 哈希&#xff08;hash&#xff09; 先了解一下啥是哈希&#xff08;网上有很多介绍&#xff09;&#xff0c;是一种散列函数&#xff0c;简单来…

带控制端的逻辑运算电路_分别完成正整数的平方、立方和阶乘的运算verilog语言...

练习&#xff1a;设计一个带控制端的逻辑运算电路&#xff0c;分别完成正整数的平方、立方和阶乘的运算。 //--------------myfunction---------- modulemyfunction(clk,n,result,reset,sl); output[6:0]result; input[2:0] n; input reset,clk; input [1:0] sl; reg[6:0]resul…

Java并发编程之并发容器ConcurrentHashMap(JDK1.8)解析

这个版本ConcurrentHashMap难度提升了很多&#xff0c;就简单的谈一下常用的方法就好了&#xff0c;可能有些讲的不太清楚&#xff0c;麻烦发现的大佬指正一下 主要数据结构 1.8将Segment取消了&#xff0c;保留了table数组的形式&#xff0c;但是不在以HashEntry纯链表的形式…

simulink显示多个数据_如何在 Simulink 中使用 PID Tuner 进行 PID 调参?

作者 | 安布奇责编 | 胡雪蕊出品 | CSDN(ID: CSDNnews)本文为一篇技术干货&#xff0c;主要讲述在Simulink如何使用PID Tuner进行PID调参。PID调参器( PIDTuner)概述1.1 简介使用PID Tuner可以对Simulink模型中的PID控制器&#xff0c;离散PID控制器&#xff0c;两自由度PID控制…

Java并发编程之堵塞队列介绍以及SkipList(跳表)

堵塞队列 先了解一下生产者消费者模式&#xff1a; 生产者就是生产数据的一方&#xff0c;消费者就是消费数据的另一方。在多线程开发中&#xff0c;如果生产者处理速度很快&#xff0c;而消费者处理速度很慢&#xff0c;那么生产者就必须等待消费者处理完&#xff0c;才能继…

python生成list的时候 可以用lamda也可以不用_python 可迭代对象,迭代器和生成器,lambda表达式...

分页查找#5.随意写一个20行以上的文件(divmod)# 运行程序&#xff0c;先将内容读到内存中&#xff0c;用列表存储。# l []# 提示&#xff1a;一共有多少页# 接收用户输入页码&#xff0c;每页5条&#xff0c;仅输出当页的内容def read_page(bk_list,n,endlineNone):startline …

数据挖掘技术简介[转]

关键词&#xff1a; 关键词&#xff1a;数据挖掘 数据集合 1. 引言  数据挖掘(Data Mining)是从大量的、不完全的、有噪声的、模糊的、随机的数据中提取隐含在其中的、人们事先不知道的、但又是潜在有用的信息和知识的过程。随…

树莓派安装smbus_树莓派使用smbus不兼容问题(no module named 'smbus')

树莓派使用smbus不兼容问题(no module named ‘smbus’)python3.5–3.6可以使用smbus2代替smbus1. 先参考以下方法&#xff1a;github讨论树莓派社区2.Pypi上可以下载smbus2smbus2PyPi介绍&#xff1a;当前支持的功能有&#xff1a;获取i2c功能(I2C_FUNCS)read_bytewrite_byter…

Java并发编程之线程池ThreadPoolExecutor解析

线程池存在的意义 平常使用线程即new Thread()然后调用start()方法去启动这个线程&#xff0c;但是在频繁的业务情况下如果在生产环境大量的创建Thread对象是则会浪费资源&#xff0c;不仅增加GC回收压力&#xff0c;并且还浪费了时间&#xff0c;创建线程是需要花时间的&…

面向过程的门面模式

{*******************************************************}{ }{ 业务逻辑一 }{ }{ 版权所有 (C) 2008 陈…

Java并发编程之线程定时器ScheduledThreadPoolExecutor解析

定时器 就是需要周期性的执行任务&#xff0c;也叫调度任务&#xff0c;在JDK中有个类Timer是支持周期性执行&#xff0c;但是这个类不建议使用了。 ScheduledThreadPoolExecutor 继承自ThreadPoolExecutor线程池&#xff0c;在Executors默认创建了两种&#xff1a; newSin…

python xml转换键值对_Python 提取dict转换为xml/json/table并输出

#!/usr/bin/python#-*- coding:gbk -*-#设置源文件输出格式import sysimport getoptimport jsonimport createDictimport myConToXMLimport myConToTabledef getRsDataToDict():#获取控制台中输入的参数&#xff0c;并根据参数找到源文件获取源数据csDict{}try:#通过getopt获取…

应用开发框架之——根据数据表中的存储的方法名称来调用方法

功用一&#xff1a;在框架里面根据存储在数据表中的方法名来动态调用执行方法。 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 class(TForm) Button1: TButton; procedu…