成都汇智动力老师直接接听

400-029-09** 400-029-0997 转 65635
查看完整号码
扫码拨号
微信扫码拨号

Java开发之高并发必备篇(六)——Lock和ReentrantLock

作者:汇智动力学院 来源:汇智动力学院 2022/10/6 14:24:27

在java面试中,多线程的安全锁的问题其实不仅仅局限于syn...

在java面试中,多线程的安全锁的问题其实不仅仅局限于synchronized,还会被问到lock锁以及代表子类ReentrantLock可重入锁。 Lock锁介绍 从JDK1.5之后,在java.util.concurrent.locks 包下提供了另外一种方式来实现线程同步访问,那就是Lock锁。 之前介绍了synchronized虽然在jdk1.6之后对它进行了优化和升级,但是它还是有一些明显的缺陷: 当一个线程持有了一个同步代码的锁时,如果执行过程中遇到了IO或者其他的耗时操作(例如:sleep等)的时候,它的锁并没有被释放;这样其他的线程还需要等待它的执行那么就会非常的影响执行效率。 如果在执行某个任务的时候,我们需要当满足一个条件的时候就释放掉锁让其他线程执行任务,因为synchronized是自动获取和释放锁的所以这样的情况下synchronized也无法实现。 当多个线程读写文件或数据的时候,我们知道如果出现了有的线程读有的线程写的时候或者多个线程都写都会导致冲突;但是如果多个线程只是读的话就不存在冲突问题,这一个时候使用synchronized也只是可以一个线程进行读操作效率很低,无法到达当多个线程进行读操作的时候不冲突的情况。 synchronized是java内置的关键字,并且它不需要用户手动获取锁,当代码执行完毕或者出现了未捕获的异常那么JVM也会让线程自动释放锁。而Lock锁是java定义的一个接口,它提供比使用synchronized方法和语句可以获得的更广泛的锁定操作,锁的获取和释放需要手动,这样可以更加灵活的操作锁,使用Lock锁能以更优雅的方式处理线程同步的问题。下面我们就来了解下这个Lock接口。 Lock接口 通过查看源码,我们发现Lock接口中定义了6个方法,介绍如下:
ReentrantLock可重入锁介绍 ReentrantLock类是Lock接口常用的实现子类,它是一个可重入互斥的Lock。 ReentrantLock提供了更多的锁操作,它的构造函数接受可选的公平参数,参数为true则表示获取一个公平锁,不带参数或者false表示一个非公平锁。
公平锁 的情况下,线程按照先进先出(FIFO)的顺序获取锁资源,但是按照顺序执行不一定是CPU资源的最大化 利用; 非公平锁
公平锁代码实现:
非公平锁源码:
这两个类都是Sync类的子类,而Sync类又是AbstractQueuedSynchronizer(简称AQS)的子类,在获取锁的时候都调用了AQS中定义的acquire方法;

这里的代码是用来 来判断 AQS 的队列中是否有其他线程,如果有则不会尝试获取锁 , 这样也就保证了获取锁的线程的顺序执行。 下篇文章我们将介绍如何使用lock锁来获取锁、释放锁等操作。 二、算法的设计原则   ①、正确性:首先,算法应当满足以特定的“规则说明”方式给出的需求。其次,对算法是否“正确”的理解可以有以下四个层次:   一、程序语法错误。   二、程序对于几组输入数据能够得出满足需要的结果。   三、程序对于精心选择的、典型、苛刻切带有刁难性的几组输入数据能够得出满足要求的结果。   四、程序对于一切合法的输入数据都能得到满足要求的结果。   PS:通常以第 三 层意义的正确性作为衡量一个算法是否合格的标准。   ②、可读性:算法为了人的阅读与交流,其次才是计算机执行。因此算法应该易于人的理解;另一方面,晦涩难懂的程序易于隐藏较多的错误而难以调试。   ③、健壮性:当输入的数据非法时,算法应当恰当的做出反应或进行相应处理,而不是产生莫名其妙的输出结果。并且,处理出错的方法不应是中断程序执行,而是应当返回一个表示错误或错误性质的值,以便在更高的抽象层次上进行处理。   ④、高效率与低存储量需求:通常算法效率值得是算法执行时间;存储量是指算法执行过程中所需要的*大存储空间,两者都与问题的规模有关。   前面三点 正确性,可读性和健壮性相信都好理解。对于第四点算法的执行效率和存储量,我们知道比较算法的时候,可能会说“A算法比B算法快两倍”之类的话,但实际上这种说法没有任何意义。因为当数据项个数发生变化时,A算法和B算法的效率比例也会发生变化,比如数据项增加了50%,可能A算法比B算法快三倍,但是如果数据项减少了50%,可能A算法和B算法速度一样。所以描述算法的速度必须要和数据项的个数联系起来。也就是“大O”表示法,它是一种算法复杂度的相对表示方式,这里我简单介绍一下,后面会根据具体的算法来描述。   相对(relative):你只能比较相同的事物。你不能把一个做算数乘法的算法和排序整数列表的算法进行比较。但是,比较2个算法所做的算术操作(一个做乘法,一个做加法)将会告诉你一些有意义的东西;   表示(representation):大O(用它*简单的形式)把算法间的比较简化为了一个单一变量。这个变量的选择基于观察或假设。例如,排序算法之间的对比通常是基于比较操作(比较2个结点来决定这2个结点的相对顺序)。这里面就假设了比较操作的计算开销很大。但是,如果比较操作的计算开销不大,而交换操作的计算开销很大,又会怎么样呢?这就改变了先前的比较方式;   然后我们再说说算法的存储量,包括:    程序本身所占空间;    输入数据所占空间;    辅助变量所占空间;   一个算法的效率越高越好,而存储量是越低越好。 三、算法的分类 算法可以宏泛的分为三类: 一,有限的,确定性算法 这类算法在有限的一段时间内终止。他们可能要花很长时间来执行指定的任务,但仍将在一定的时间内终止。这类算法得出的结果常取决于输入值。 二,有限的,非确定算法 这类算法在有限的时间内终止。然而,对于一个(或一些)给定的数值,算法的结果并不是的或确定的。 三,无限的算法 是那些由于没有定义终止定义条件,或定义的条件无法由输入的数据满足而不终止运行的算法。通常,无限算法的产生是由于未能确定的定义终止条件。 Java中常见的算法有: ①、排序 排序就是对一组数据按照一定的顺序(从大到小或者从小到大)进行排序; 常见排序如下: 简单排序:冒泡排序、选择排序、插入排序; 高级排序:快速排序、希尔排序、归并排序、基数排序、鸡尾酒排序等等; ②、递归 递归是一种直接或者间接调用自身的一种算法,递归的目的是简化程序设计使程序更加易读; ③、查找 在一些(有序的/无序的)数据元素中,通过一定的方法找出与给定关键字相同的数据元素就叫做查找; ④、统计 指对有关数据的搜集、整理、计算、分析、解释、表述等的活动。 往期文章 墙裂推荐 [1] Java开发之高并发必备篇(五)——线程安全操作之synchronized [2] Java开发之高并发必备篇(四)——线程的状态、调度和操作方法 [3] Java开发之高并发必备篇(三)——线程的内存模型 原创视频 墙裂推荐 2022转行软件测试之就业喜报 ↓↓↓

活动福利 // 1 毕业礼包 | 毕业学员免费赠送《软件测试技术大咖专题课》,助力学员早日突破高薪瓶颈 // 2 入职礼包 |就业学员免费赠送《Java语言开发视频课》及全套源代码,市场价值12800元 // 3 推荐有奖 |推荐好友成功报名,立得丰厚“伯乐”红包 (欢迎详询校区老师)

详询软件测试&开发培训事宜

添加微信咨询
杨老师 @成都汇智动力

专业解答各类课程问题、介绍师资和学校情况

微信号:186******73

立即咨询

“成都汇智动力”是成都汇智动力信息技术有限公司在教育宝平台开设的店铺,若该店铺内信息涉嫌虚假或违法,请点击这里向教育宝反馈,我们将及时进行处理。

机构评分

环境:5.0师资:5.0服务:4.0效果:4.0

公示信息

店铺名称:成都汇智动力

单位名称:成都汇智动力信息技术有限公司

账号名称:cdhzdl(180******07)

所属城市:四川成都

入驻时长:12年

在线客服:在线聊

微信咨询

返回顶部