并发性标注 @GuardedBy @NotThreadSafe @ThreadSafe

并发性标注

类的标注

这三个类级别的标注可以描述类的线程安全保证性,属于类公开文档的一部分.它只是标注了该类是否是线程安全的,但实际上没法保证线程安全.

  • @Immutable
    表示类是不可变得既是final修饰的,它是线程安全的

  • @ThreadSafe
    类是线程安全的

  • @NotThreadSafe
    类不是线程安全的,如果类未加任何注解,则不能确定是否线程安全,认为是非线程安全的

它们都是非侵入式的,我们可以通过它来看出一个类是否是线程安全的.

域和方法的标注

用来保证线程安全性,
在使用加锁的类中,我们应该指定那些状态变量是由哪些锁保护的,以及哪些锁被用于保护这些变量.
一种造成不安全的常见原因是:某个线程安全的类一直通过加锁来保护其状态,但随后又对这个类进行了修改,并添加了一些未通过锁来保护的新变量,或者没有使用正确的加锁来保护现有状态变量的新方法.
所以,通过指定哪个状态变量被哪个锁保护,以及哪个锁保护这些状态变量的信息可以保证线程的安全性

GuardedBy(lock) 表示只有在持有了某个特定的锁时才能访问这个域或方法.
参数lock表示在访问被标注的域或方法时需要线程持有与之对应的锁.

*lock的可能取值:

  • @GuardedBy(“this”)
    表示在包含对象上的内置锁(被标注的方法或域是该对象的成员)
  • @GuardedBy(“fieldName”)
    表示与filedName引用的对象相关联的锁,可以是一个隐式锁(对于不引用一个Lock的域),也可以是一个显式锁(对于引用了一个Lock的域)
  • @GuardedBy(“ClassName.fieldName”)
    类似于@GuardedBy(“fieldName”),不过所引用的锁对象是存储在另一个类(或本类)中的静态域
  • @GuardedBy(“methodName()”)
    指通过调用命名方法返回的锁对象
  • @GuardedBy(“ClassName.class”)
    指命名类的类字面量对象
public class GuardedByTest {
	@GuardedBy("this")
	private int value;

	public synchronized int getValue() {
		return value++;
	}
}

表示持有该对象的锁可以访问该变量;
在不同线程中,同一对象访问该函数时,会串行执行,不会发生线程共享数据错误的情况

public class GuardedByTest {

	public void getValue() {
		synchronized(this) // 表示锁住的是对象,同一对象调用该函数会串行执行,不同对象调用该函数会并行执行
		synchronized(GuardedByTest.class) // 表示锁住该类,不管是不是同一对象执行该函数都是串行执行
		// dothing
	}
}
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值