Java并发性标注@Immutable,@ThreadSafe,@NotThreadSafe,@GuardedBy(lock)

JAVA并发性标注

1.类的标注

@Immutable,@ThreadSafe和@NotThreadSafe。

	@Immutable表示类是不可变的,它包含了@ThreadSafe的定义。
	@NotThreadSafe是可选的,如果一个类没有标注为线程安全的,那么就应该加上它不是线程安全的,但如果想明确的表示这个类不是
线程安全的,那么就可以使用@NotThreadSafe。
	这些标注都是非侵入式的,它们对于使用者和维护人员来说都是有益的。使用者可以立即看出一个类是否是线程安全的,而维护人员也
可以直接的看到是否维持了线程安全性保证。
	对第三方来说,标准同样很有用:工具。静态的代码分析工具可以验证代码是否遵守了由标注指定的契约 例如验证被标注为@Immutable
的类是否是不可变的。

上述类级别的标注属于类公开文档的一部分。类的线程安全性策略的其他方面只对于维护人员有用,而不应该作为公开文档的一部分。

2.域和方法的标注

在使用加锁的类中,应该说明哪些状态变量有哪些锁保护的,以及哪些锁被用于保护这些变量。一种造成不安全性的常见原因是:某个线程安全的类一直通过加锁来保护其状态,

但随后又对这个类进行了修改,并添加了一些未通过锁来保护的新变量,或者没有使用正确加锁来保护现有状态变量的新方法。通过说明哪些变量由哪些锁来保护,有助于避免这些疏忽。

	@GuardedBy(lock)表示只有在持有了某个特定的锁时才能访问这个域或方法。参数lock表示在访问被标注的域或方法时需要持有
的锁。lock的可能取值包括:
	.@GuardedBy("this"),表示在包括对象上的内置锁(被标注的方法或域是该对象的成员)。
	.@GuardedBy("fieldName"),表示与fieldName引用的对象相关联的锁,可以是一个隐式锁(对于不引用一个Lock的域),
			也可以是一个显示锁(对于引用了一个Lock的域)。
	.@GuardedBy("Class Name.fieldName"),类似于@GuardedBy("fieldName"),但指向在另一个类的静态域中持有的锁对象
	.@GuardedBy("methodName()"),是指通过调用命名方法返回的锁对象
	.@GuardedBy("ClassName.class"),是指命名类的类字面量对象。

通过@GuardedBy来标识每个需要加锁的状态变量以及保护该变量的锁,能够有助于代码的维护与审查,以及通过一些自动化的分析工具找出潜在的线程安全性错误。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值