让我们继续前面有关ReentrantLock的话题。
首先,ReentrantLock有一个带布尔型参数的构造函数
,在JDK官方文档中对它是这样描述的:
“此类的构造方法接受一个可选的公平 参数。当设置为 true
时,在多个线程
的争用下,这些锁倾向于将访问
权授予等待时间最长的线程
。否则此锁将无法保证任何特定访问顺序。与采用默认设置(使用不公平锁)相比,使用
公平锁的程序在许多线程访问时表现为很低的总体吞吐量(即速度很慢,常常极其慢),但是在获得锁和保证锁分配的均衡性时差异较小。不过要注意的是,公平锁
不能保证线程调度的公平性。因此,使用公平锁的众多线程中的一员可能获得多倍的成功机会,这种情况发生在其他活动线程没有被处理并且目前并未持有锁时。还
要注意的是,未定时的 tryLock 方法并没有使用公平设置。因为即使其他线程正在等待,只要该锁是可用的,此方法就可以获得成功。 ”
简单来讲:公平锁使线程按照请求锁的顺序依次获得锁;而不公平锁则允许讨价还价,在这种情况下,线程有时可以比先请求锁的其他线程先得到锁。
观察采用公平锁和非公平锁的例程运行效果发现:线程获得锁的顺序发生了一些变化(见下表)。
Unfair:
1 is running!
1 got lock1@Step1!
3 is running!
2 is running!
1 first Reading count:1
1 release lock1@Step1!
3 got lock1@Step1!
1 got lock2@Step2!
thread 1 set age to:18
thread 1 first read age
is:18
3 first Reading count:2
3 release lock1@Step1!
2 got lock1@Step1!
thread 1 second read age
is:18
1 release lock2@Step2!
3 got lock2@Step2!
thread 3 set age to:34
thread 3 first read age
is:34
2 first Reading count:3
2 release lock1@Step1!
thread 3 second read age
is:34
3 release lock2@Step2!
2 got lock2@Step2!
thread 2 set age to:72
thread 2 first read age
is:72
thread 2 second read age
is:72
2 release lock2@Step2!
成功生成(总时间:20
秒)
|
Fair:
1 is running!
1 got lock1@Step1!
2 is running!
3 is running!
1 first Reading count:1
1 release lock1@Step1!
1 got lock2@Step2!
thread 1 set age to:82
thread 1 first read age
is:82
2 got lock1@Step1!
2 first Reading count:2
2 release lock1@Step1!
3 got lock1@Step1!
thread 1 second read age
is:82
1 release lock2@Step2!
2 got lock2@Step2!
thread 2 set age to:65
thread 2 first read age
is:65
3 first Reading count:3
3 release lock1@Step1!
thread 2 second read age
is:65
2 release lock2@Step2!
3 got lock2@Step2!
thread 3 set age to:31
thread 3 first read age
is:31
thread 3 second read age
is:31
3 release lock2@Step2!
成功生成(总时间:20
秒)
|
这样的变化告诉我们:
采用非公平的锁
时,当一个线程释放了第一个锁
以后,由于线程的抢占
,刚刚被释放的锁马上被下一个线程占有
。采用公平锁
时,由于公平锁倾向于将访问权授予等
待时间最长的线程,所以,当第一个锁被第一个线程释放
以后,第二个锁马上将访问权授予第一个线程
,而第一个锁将访问权授予了第二个线程
。这里,公平锁在平
衡分配方面耗费了一定的时间,这使得第一个线程获得第二个锁的时间优先于第二个线程获得第一个锁。这样,采用不同的锁,就出现了两种不同的结果。
为了看到公平锁和非公平锁性能上的差异,我们不妨将其中线程的睡眠时间设定为1毫秒,然后把循环产生的线程数提高到5000(修改后的代码已忽略,自行修改),可以发现,由于公平锁要维持锁分配的均衡性,所以,采用公平锁的程序总运行时间更长一些
。
根据运行环境的差异,有些朋友可能并不一定能很直观的从运行结果中看到两种不同的锁带来的性能差异。不妨引用IBM开发者社区的一组测试结果来看一看就行有什么样的差异吧:
4CPU情况下的同步、非公平锁和公平锁吞吐量比较:
单CPU情况下,同步、非公平锁和公平锁的吞吐量:
可以看到,同步和公平锁的吞吐量都是最低的,公平锁更低一些。但是同步内置的监控器锁是不公平的,而且永远都是不公平的。而JVM
保证了所有线程最终都会得到它们所等候的锁。确保统计上的公平性,对多数情况来说,这就已经足够了,而这花费的成本则要比绝对的公平保证的低得多。
既然Lock这么近乎完美,那我们也许可以忘却synchronized了。
但是任何事物都是有两面性的。
1.使用Lock,你必须手动的在finally块中释放锁。锁的获得和释放是不受JVM控制的。这要求编程人员更加细心。
2.当 JVM 用 synchronized 管理锁定请求和释放时,JVM
在生成线程转储时能够包括锁定信息。这些对调试非常有价值,因为它们能标识死锁或者其他异常行为的来源。
Lock
类只是普通的类,JVM 不知道具体哪个线程拥有
Lock
对象。
Lock提供了在多线程争用的情况下更好的并发性,但这是以牺牲一定的可维护性为代价的。
所以说,当大量线程发生争用的时候,Lock来了,大家都让开。
来源:
http://x-spirit.iteye.com/blog/625219
分享到:
相关推荐
4. **fair** 的名词形式是 **fairness**,意为“公正”,反义词是 **unfair**,表示“不公平”。 5. **ill** 的名词形式是 **illness**,指“疾病”。 6. **communicate** 的名词形式是 **communication**,表示...
(This is a little bit of a white lie, as modern routers sometimes act as firewalls or caching components, and process Transport layer as well.) Link layer switches process link and physical layers ...
I think it's unfair. (不公平的) 3. They often borrow books from the library. (借入) 4. The girl is a kind nurse and she always takes good care of sick people. (照顾) 5. You should throw the trash ...
然而,多线程环境下的数据同步问题不容忽视,这就引入了“锁”的概念。本文将深入探讨iOS中的各种锁,包括互斥锁、自旋锁、读写锁、NSLock、NSConditionLock以及NSOperationQueue等,并通过具体的代码示例进行讲解。...
【仁爱英语八年级下册单词测试】Unit5Topic 1 的内容涵盖了多个重要的英语词汇和词组,这些知识对于学习者来说是非常基础且实用的。让我们逐一解析: 重点单词: 1. 邀请、招待 - invite 2. 向……表示感激 - ...
This library is a work in progress, I am looking for some feedback on this to see if there is a need for it. This article is also a work in progress please bookmark and come back later, if you want ...
- **同步机制**:为了保证数据的一致性和避免竞态条件,Java提供了多种同步机制,如`synchronized`关键字、显式锁(`Lock`接口)等。 - **原子操作**:对于一些基本的数据类型,Java提供了`AtomicInteger`、`...
10. fair - unfair 11. formal - informal 12. free - busy / occupied 13. high - low 14. interesting - boring 15. last - first 16. helpful - unhelpful 17. careful - careless 18. patient - impatient 19. ...
解决方案是使用线程同步技术,常见的线程同步技术有:加锁(OSSpinLock、os_unfair_lock、pthread_mutex、NSLock、NSRecursiveLock、NSCondition、NSConditionLock)、dispatch_semaphore、dispatch_queue(DISPATCH_...
An Excluded License is one that requires, as a condition of use, modification or distribution, that * the code be disclosed or distributed in source code form; or * others have the right to modify ...
2014年时,SUN的开发团队面临的问题正是如何有效地利用多线程来提高性能,同时避免由此带来的线程同步问题。在iOS中,Grand Central Dispatch (GCD) 是苹果提供的多线程解决方案,它为开发者提供了强大的并发编程...
10. fair → unfair(形容词,不公平的) Ⅱ. 写出以下单词: 1. 速度 → speed(名词,速度) 2. 一望无际 → endless(形容词,无边无际的) 3. 农业 → agriculture(名词,农业) 4. 灾难 → disasters(名词...
It also applies even if Sysinternals knew or should have known about the possibility of the damages. The above limitation or exclusion may not apply to you because your country may not allow the ...
【高中英语Unit5 Nelson Mandela---a Modern Hero 基础词汇巩固】 在学习高中英语Unit5 Nelson Mandela单元时,巩固基础词汇是至关重要的。以下是一些词汇及其转换和用法: 1. self - 自我 - selfless - 无私的 ...
mips 的 4ksd芯片手册 Unpublished work (C) MIPS Technologies, Inc. All rights reserved....laws of the United States of America ...SEAD-2, SOC-it and YAMON are among the trademarks of MIPS Technologies, Inc.
【Unit 2 The United Kingdom教案1】 本单元主要聚焦于英国这一主题,旨在帮助学生学习和理解与英国相关的词汇和语言结构。以下是本教案的重点知识梳理: **词汇部分:** 1. **divide/separate**: - `divide` ...
What day is it today:今天是星期几。 - **知识点详解**: - “What's the date today”询问具体的日期。正确答案是C。 ### 二、完形填空知识点解析 #### 1. 名词 - **原文**:“some of her students had ...
【解析】There is no point doing sth. 是固定搭配,表示“做某事没有意义”。在这里指询问父母是没有意义的,因为他们也没有多余的钱。 ( ) 6. A. save B. spend C. spare D. share 【答案】C。 【解析】spare ...
This document contains confidential information that is the strict property of Innova Card, and may only be disclosed with written permission from Innova Card itself. Any copy, reproduction, ...
这篇测试题是针对八年级英语下册Unit3 "Could you please...这些题目涵盖了英语中的动词搭配、形容词辨析、连词使用、比较级以及固定句型等多个知识点,旨在帮助学生巩固Unit3的学习内容,提高他们的英语综合运用能力。