同步Annotation

1.类Annotation

有3个类级Annotation来描述类的可预期的线程安全性保证:@Immutable、@ThreadSafe、@NotThreadSafe。

@Immutable :意味着类是不可变的,并包含了@ThreadSafe的意义。

@NotThreadSafe :可选的,如果类没有被标明是线程安全的,就无法肯定它是不是线程安全的。

@ThreadSafe :标明类是线程安全的。

这些Annotation是非侵入性的,用户可以立即看出一个类是否是线程安全的,维护者也可以直接检查类是否遵循了线程安全性保证。

静态的代码分析工具可以有能力对代码进行验证,看它是否遵循了由Annotation指定的契约,比如标明为@Immutable的类是否真的不可变

2.域Annotation和方法Annotation

@GuardedBy(lock):

  1. 线程只有在持有了一个特定的锁后,才能访问某个域或方法。lock参数代表一个锁,只有持有了该锁,才能访问被标注的域或方法。

lock可能值如下:

  • @GuardedBy(“this”)

    • 包含在对象中的内部锁(方法或域是这个对象的一个成员)
  • @GuardedBy(“fieldName”)

    • 与fieldName引用的对象相关联的锁,它或者是一个隐式锁(fieldName没有引用一个Lock),或者是一个显式锁(fieldName引用了一个Lock)。
  • @GuardedBy(“ClassName.fieldName”)

    • 类似于@GuardedBy(“fieldName”),不过所引用的锁对象是存储在另一个类中的静态域
  • @GuardedBy(“methodName()”)

    • 指锁对象是methodName()方法的返回值
  • @GuardedBy(“ClassName.class”)

    • 指ClassName类的直接量对象。

使用@GuardedBy标识出每一个需要加锁的状态变量,这个锁确保它会有助于维护和代码审查,而且能够帮助自动化分析工具发现潜在的线程安全性错误。