- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Java并发编程规则:设计线程安全的类
Java并发编程规则:设计线程安全的类
封装设计:
尽管所有的状态都存储在公共静态变量(域)中,仍然能写出线程安全的程序,但比起那些适当封装的类来说,我们难以验证这种程序的线程安全性,也很难再修改它的同步不破坏它的线程安全性。在没有进行全局检查的情况下,封装能够保证线程的安全性。
=====设计线程安全类的过程应该包括下面3个基本要素:========
1、确定对象状态是由哪些变量组成的;
2、确定限制状态变量的不变约束;
3、制定一个管理并发访问对象状态的策略。
同步策略方式:
对状态使用同步策略,以维护其不变约束。需要明确的是同步的需求是什么,并分析其不可变约束和后验条件。
[java] view plain copy print?在CODE上查看代码片派生到我的代码片
package net.jcip.examples;
import net.jcip.annotations.*;
/**
* Counter
* p/
* Simple thread-safe counter using the Java monitor pattern
*
* @author Brian Goetz and Tim Peierls
*/
@ThreadSafe
public final class Counter {
@GuardedBy(this) private long value = 0;
public synchronized long getValue() {
return value;
}
public synchronized long increment() {
if (value == Long.MAX_VALUE)
throw new IllegalStateException(counter overflow);
return ++value;
}
}
注:不理解对象的不可变约束和后验条件,就不能保证线程的安全性。要约束状态变量的有效值或者状态转换,就需要原子性与封装性。
实例限制:
限制性使构造线程安全的类更容易。因为类的状态被限制后,分析它的线程安全性时,就不必检查完整的程序。
将数据封装在实体内部,把对数据的访问限制在对象的方法上,更易确保线程在访问数据时总能获得正确的锁。示例如下:
[java] view plain copy print?在CODE上查看代码片派生到我的代码片
package net.jcip.examples;
import java.util.*;
import net.jcip.annotations.*;
/**
* PersonSet
* p/
* Using confinement to ensure thread safety
*
* @author Brian Goetz and Tim Peierls
*/
@ThreadSafe
public class PersonSet {
@GuardedBy(this) private final SetPerson mySet = new HashSetPerson();
public synchronized void addPerson(Person p) {
mySet.add(p);
}
public synchronized boolean containsPerson(Person p) {
return mySet.contains(p);
}
interface Person {
}
}
HashSet是一个线程安全的类,通过公开的方法进行同步读写操作,确保了线程的安全性。
Java监视器模式:
像Vector和HashTable这样的核心库类,都是采用了Java监视器模式,其最大优势在于简单。Java监视器模式仅仅是一种习惯约定:任意锁对象只要始终如一地使用,都可以用来保护对象的状态。来看个私有锁保护状态的示例:
[java] view plain copy print?在CODE上查看代码片派生到我的代码片
package net.jcip.examples;
import net.jcip.annotations.*;
/**
* PrivateLo
文档评论(0)