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

星标Java学习之道一起成长,一起学习~

1序

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

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

6c411f8f44d6e76d0f2040f45b77fead.png
<!-- 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。主要包括三类:

4b5a6abf51826b37488edf9a44184f22.png

2类 Annotation(注解)

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

@ThreadSafe

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

@Immutable

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

@NotThreadSafe

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

小结

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

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

3域 Annotation(注解)

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

4方法 Annotation(注解)

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

小结

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

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

5@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++;  
    }  
}

-- END --

 
 
欢迎大家进行观点的探讨和碰撞,各抒己见。如果你有疑问,也可以找我沟通和交流。▽加我微信,交个朋友

e71d52c03d28143edabf6eae4d08e15c.jpeg

长按/扫码添加↑↑↑

61cd1548bd76e77e048a5d363bcb03e0.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MobiusStrip

请我喝杯奶茶吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值