zoukankan      html  css  js  c++  java
  • 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++;  
        }  
    }  
  • 相关阅读:
    POJ 3259 Wormholes【BellmanFord】
    POJ 2960 SNim【SG函数的应用】
    ZOJ 3578 Matrixdp水题
    HDU 2897 邂逅明下【bash博弈】
    BellmanFord 算法及其优化【转】
    【转】几个Java的网络爬虫
    thinkphp 反字符 去标签 自动加点 去换行 截取字符串 冰糖
    php 二维数组转 json文本 (jquery datagrid 数据格式) 冰糖
    PHP 汉字转拼音(首拼音,所有拼音) 冰糖
    设为首页与加入收藏 兼容firefox 冰糖
  • 原文地址:https://www.cnblogs.com/guchunchao/p/10598804.html
Copyright © 2011-2022 走看看