Java同步注解:@ThreadSafe、@Immutable、@NotThreadSafe、@GuardedBy

Java 并发编程中,用到了一些专门为并发编程准备的 Annotation。主要包括三类:

<dependency>  
    <groupId>net.jcip</groupId>  
    <artifactId>jcip-annotations</artifactId>  
    <version>1.0</version>  
</dependency> 

注解包含以下类

 


1、类 Annotation(注解)
就像名字一样,这些注解是针对类的。主有要以下三个:
@ThreadSafe

  是表示这个类是线程安全的。具体是否真安全,那要看实现者怎么实现的了,反正打上这个标签只是表示一下。不线程安全的类打上这个注解也没事儿。
@Immutable

  表示类是不可变的,包含了 @ThreadSafe 的意思。
@NotThreadSafe

  表示这个类不是线程安全的。如果是线程安全的非要打上这个注解,那也不会报错。

这三个注解,对用户和维护者是有益的,用户可以立即看出来这个类是否是线程安全的,维护者则是可以根据这个注解,重点检查线程安全方面。另外,代码分析工具可能会利用这个注解。


2、域 Annotation(注解)
  域注解是对类里面成员变量加的注解。


3、方法 Annotation(注解)
  方法注解是对类里面方法加的注解。

  域注解和方法注解都是用 @GuardedBy(lock) 来标识。里面的 Lock 是告诉维护者:这个状态变量,这个方法被哪个锁保护着。这样可以强烈的提示类的维护者注意这里。

  @GuardedBy(lock) 有以下几种使用形式:

  1、@GuardedBy("this") 受对象内部锁保护
  2、@GuardedBy("fieldName") 受 与 fieldName 引用相关联的锁 保护。
  3、@GuardedBy("ClassName.fieldName") 受 一个类的静态 field 的锁 保存。
  4、@GuardedBy("methodName()" )锁对象是 methodName() 方法的返值,受这个锁保护。
  5、@GuardedBy("ClassName.class") 受 ClassName 类的直接锁对象保护。而不是这个类的某个实例的锁对象。


 

2. 域 Annotation 和方法 Annotation 
描述哪个状态变量被哪个锁保护着,以及哪个锁保护这些变量的信息: 
@GuardedBy(lock):线程只有在持有了一个特定的锁(lock)后,才能访问某个域或方法; 
@GuardedBy("this"):包换在对象中的内部锁(方法或域是这个对象的一个成员); 
@GuardedBy("fieldName"):值与 filedName 引用的对象相关联的锁,或者是一个隐式锁(filedName 没有引用一个 Lock),或者是一个显示锁(filedName 引用了一个 Lock); 
@GuardedBy("ClassName.fieldName"):类似于 @GuardedBy("fieldName"),不过所引用的锁对象是存储在另一个类(或本类)中的静态域; 
@GuardedBy("methodName()"):锁对象是 methodName() 方法的返回值; 
@GuardedBy("ClassName.class"):ClassName 类的直接量对象。 


 

 

例子

import javax.annotation.concurrent.*;;  

@ThreadSafe
public class Sequence {

@GuardedBy(</span>"this") <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> value;  
  
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">synchronized</span> <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> getNext() {  
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> value++<span style="color: rgba(0, 0, 0, 1)">;  
}  

}