Java同步注解: @ThreadSafe、@Immutable、@NotThreadSafe、@GuardedBy 置顶!
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++;
}
}
参考资料
- https://stackoverflow.com/questions/11362298/guardedby-threadsafe-notthreadsafe
- https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/annotation/NotThreadSafe.html
- https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/annotation/ThreadSafe.html
- https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/annotation/Immutable.html
- https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/annotation/GuardedBy.html
- https://juejin.cn/post/6977553381875253284
标题:Java同步注解: @ThreadSafe、@Immutable、@NotThreadSafe、@GuardedBy
作者:mmzsblog
地址:https://www.mmzsblog.cn/articles/2023/05/08/1683556286059.html
如未加特殊说明,文章均为原创,转载必须注明出处。均采用CC BY-SA 4.0 协议!
本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。若本站转载文章遗漏了原文链接,请及时告知,我们将做删除处理!文章观点不代表本网站立场,如需处理请联系首页客服。• 网站转载须在文章起始位置标注作者及原文连接,否则保留追究法律责任的权利。
• 公众号转载请联系网站首页的微信号申请白名单!
