欢迎来到淼淼之森的博客小站。  交流请加我微信好友: studyjava。  也欢迎关注同名公众号:Java学习之道

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

  |   0 评论   |   0 浏览

0、序

本文阿淼主要讲述,Java同步注解: @ThreadSafe@Immutable@NotThreadSafe@GuardedBy

目前我所知道的是,@Immutable、@ThreadSafe、@NotThreadSafe、@GuardedBy 都不是 JDK 的标准注释。如果我们需要使用它们,需要导入额外的依赖项:jcip-annotations.jar

<!-- https://mvnrepository.com/artifact/net.jcip/jcip-annotations -->
<dependency>
    <groupId>net.jcip</groupId>
    <artifactId>jcip-annotations</artifactId>
    <version>1.0</version>
    <scope>provided</scope>
</dependency>

在Java并发编程中,这些专门为并发编程准备的 Annotation。主要包括三类:

1、类 Annotation(注解)

就像名字一样,这些注解是针对类的。主有要以下三个:

@ThreadSafe

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

@Immutable

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

@NotThreadSafe

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

小结

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

使用加锁的类中,应该指明那些状态变量由那些锁保护,以及那些锁被用于保护这些变量,一种常见的不安全性的常见原因是:某个线程安全的类一直通过加锁来保护器状态,但随后又对这个类进行了修改,并添加了一些未通过加锁来保护的新变量,或者没有正确的枷锁保护先有个状态变量的新方法。

2、域 Annotation(注解)

域注解是对类里面成员变量加的注解。

3、方法 Annotation(注解)

方法注解是对类里面方法加的注解。

小结

域注解和方法注解都是用@GuardedBy(lock)来标识。

里面的lock是告诉维护者:这个状态变量,这个方法被哪个锁保护着。这样可以强烈的提示类的维护者注意这里。

4、@GuardedBy(lock) 使用形式

@GuardedBy(lock),意味着有保护的字段或方法只能在线程持有锁时被某些线程访问。

描述哪个状态变量被哪个锁保护着,以及哪个锁保护这些变量的信息:

@GuardedBy(lock):线程只有在持有了一个特定的锁(lock)后,才能访问某个域或方法;我们可以将锁定指定为以下类型:

  • @GuardedBy("this"):受对象内部锁保护;即它是指对象中的内部锁(方法或域是这个对象的一个成员)。
  • @GuardedBy("fieldName"):受与fieldName引用相关联的锁保护;即它是指与filedName引用的对象相关联的锁,或者是一个隐式锁(filedName没有引用一个Lock),或者是一个显示锁(filedName引用了一个Lock)。
  • @GuardedBy("ClassName.fieldName"):受一个类的静态field的锁保存;即它是类似于@GuardedBy("fieldName"),不过所引用的锁对象是存储在另一个类(或本类)中的静态域。
  • @GuardedBy("methodName()"):锁对象是 methodName() 方法的返回值,受这个锁保护;即它是指该方法返回值。
  • @GuardedBy("ClassName.class"):受ClassName类的直接锁对象保护。而不是这个类的某个实例的锁对象;即它是指定类的Class对象用作锁定对象。

样例:

import javax.annotation.concurrent.*;;  
  
@ThreadSafe  
public class Sequence {  

    @GuardedBy("this") private int value;  
      
    public synchronized int getNext() {  
        return value++;  
    }  
}

参考资料


标题:Java同步注解: @ThreadSafe、@Immutable、@NotThreadSafe、@GuardedBy
作者:mmzsblog
地址:https://www.mmzsblog.cn/articles/2023/05/08/1683556286059.html

如未加特殊说明,文章均为原创,转载必须注明出处。均采用CC BY-SA 4.0 协议

本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。若本站转载文章遗漏了原文链接,请及时告知,我们将做删除处理!文章观点不代表本网站立场,如需处理请联系首页客服。
• 网站转载须在文章起始位置标注作者及原文连接,否则保留追究法律责任的权利。
• 公众号转载请联系网站首页的微信号申请白名单!

个人微信公众号 ↓↓↓                 

微信搜一搜 Java 学习之道