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

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

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

作者:汇智动力学院 来源:汇智动力学院 2022/10/14 17:23:10

ReentrantLock锁的使用 ReentrantLo...

ReentrantLock锁的使用 ReentrantLock锁的可重入性 之前我们介绍了 ReentrantLock 是一个可重入的锁,意思就一个线程可以多次的获取到锁,下面我们来看下它的可重入性。
运行上述代码,结果如下:
上述代码中 线程1 先通过 lock.lock() 表示获取到锁,然后通过调用线程的 sleep() 方法休眠0.5s之后,再次循环发现线程1又获取到了锁,总共获取了3次锁所以这就证明了ReentrantLock 锁可以被一个线程多次持有,又因为没有释放锁,所以 线程2 无法获取到锁程序也没有停止。 ReentrantLock公平锁和非公平锁 在创建 ReentrantLock 对象的时候,我们可以通过在构造方法中传入一个boolean值来切换公平锁和非公平锁。 (1)默认非公平锁实现
运行结果如下:
上述代码中我们开启了10个线程让每个线程都获取3次锁,通过运行结果我们发现,有的线程连续多次获取到了锁,而有的线程只能连续一次获取到锁,这些线程都是在竞争资源并且资源不是公平分配的,这就是非公平锁。 (2)公平锁实现 当我们在创建 ReentrantLock 对象的时候传入一个true的时候,就变成了公平锁,实现如下:
运行结果:
通过运行结果我们发现不管多少次的运行,每个线程都是只连续一次获取到锁,资源都是在平均分配的所以是公平锁。 限时等待 我们可以通过tryLock()方法传入一个时间来完成限时等待,即如果一个线程在指定时间内无法获取锁则会返回一个false表示获取锁失败,如果获取成功返回true,这样我们可以通过返回的结果来做出对应的处理。
运行结果:

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

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

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

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

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

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

立即咨询

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

机构评分

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

公示信息

店铺名称:成都汇智动力

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

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

所属城市:四川成都

入驻时长:12年

在线客服:在线聊

微信咨询

返回顶部