同步Annotation
1.类Annotation
有3个类级Annotation来描述类的可预期的线程安全性保证:@Immutable、@ThreadSafe、@NotThreadSafe。
@Immutable :意味着类是不可变的,并包含了@ThreadSafe的意义。
@NotThreadSafe :可选的,如果类没有被标明是线程安全的,就无法肯定它是不是线程安全的。
@ThreadSafe :标明类是线程安全的。
这些Annotation是非侵入性的,用户可以立即看出一个类是否是线程安全的,维护者也可以直接检查类是否遵循了线程安全性保证。
静态的代码分析工具可以有能力对代码进行验证,看它是否遵循了由Annotation指定的契约,比如标明为@Immutable的类是否真的不可变。
2.域Annotation和方法Annotation
@GuardedBy(lock):
线程只有在持有了一个特定的锁后,才能访问某个域或方法。lock参数代表一个锁,只有持有了该锁,才能访问被标注的域或方法。
lock可能值如下:
@GuardedBy(“this”)
- 包含在对象中的内部锁(方法或域是这个对象的一个成员)
@GuardedBy(“fieldName”)
- 与fieldName引用的对象相关联的锁,它或者是一个隐式锁(fieldName没有引用一个Lock),或者是一个显式锁(fieldName引用了一个Lock)。
@GuardedBy(“ClassName.fieldName”)
- 类似于@GuardedBy(“fieldName”),不过所引用的锁对象是存储在另一个类中的静态域
@GuardedBy(“methodName()”)
- 指锁对象是methodName()方法的返回值
@GuardedBy(“ClassName.class”)
- 指ClassName类的直接量对象。
使用@GuardedBy标识出每一个需要加锁的状态变量,这个锁确保它会有助于维护和代码审查,而且能够帮助自动化分析工具发现潜在的线程安全性错误。
