• 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++;  
        }  
    }  
  • 相关阅读:
    第108题:将有序数组转换成二叉搜索树
    第107题:二叉树的层次遍历II
    第106题:从中序与后序遍历序列构造二叉树
    java类读取properties文件
    WdatePicker.js开始日期和结束日期比较
    对两个整数变量的值进行互换
    Java基础知识总结
    jdk环境变量
    逻辑运算符有什么用?
    if和switch的应用
  • 原文地址:https://www.cnblogs.com/guchunchao/p/10598804.html
Copyright © 2020-2023  润新知