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("this") private int value;  
      
    public synchronized int getNext() {  
        return value++;  
    }  
}  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM