线程笔记(lock)
本文纯为笔记,转自http://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html
Java 理论与实践: JDK 5.0 中更灵活、更具可伸缩性的锁定机制
新的锁定类提高了同步性 —— 但还不能现在就抛弃 synchronized
Brian Goetz (brian@quiotix.com), 首席顾问
简介: JDK 5.0为开发人员开发高性能的并发应用程序提供了一些很有效的新选择。例如,java.util.concurrent.lock 中的类 ReentrantLock 被作为 Java 语言中synchronized 功能的替代,它具有相同的内存语义、相同的锁定,但在争用条件下却有更好的性能,此外,它还有 synchronized 没有提供的其他特性。这是否意味着我们应当忘记synchronized ,转而只用 ReentrantLock 呢?并发性专家 Brian Goetz 刚从他的夏季休假中返回,他将为我们提供答案。
?
多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之一就是,它是第一个直接把跨平台线程模型和正规的内存模型集成到语言中的主流语言。核心类库包含一个?Thread
?类,可以用它来构建、启动和操纵线程,Java 语言包括了跨线程传达并发性约束的构造 ——?synchronized
?和?volatile
?。在简化与平台无关的并发类的开发的同时,它决没有使并发类的编写工作变得更繁琐,只是使它变得更容易了。
?
图 2. synchronized 和 Lock 的吞吐率(标准化之后),4 个 CPU
图 1 和图 2 中的图表以每秒调用数为单位显示了吞吐率,把不同的实现调整到 1 线程?synchronized
?的情况。每个实现都相对迅速地集中在某个稳定状态的吞吐率上,该状态通常要求处理器得到充分利用,把大多数的处理器时间都花在处理实际工作(计算机随机数)上,只有小部分时间花在了线程调度开支上。您会注意到,synchronized 版本在处理任何类型的争用时,表现都相当差,而Lock
?版本在调度的开支上花的时间相当少,从而为更高的吞吐率留下空间,实现了更有效的 CPU 利用。
?
图 4. 使用 1 个 CPU 时的同步、协商和公平锁的相对吞吐率
Brian Goetz在过去 17 年间一直是一位专业软件开发人员。他是?Quiotix的首席顾问,该公司是一家位于加利福尼亚州洛斯拉图斯(Los Altos)的软件开发和咨询公司,他还为几个 JCP 专家组服务。请参阅流行的业界出版物中 Brian 的?已经发表和即将发表的文章。
?