本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
最近,我们的电商项目中需要一个限流功能,我打算使用令牌桶实现。
然后,我就网上查了一些关于令牌桶算法的文章,用 Java 实现了一个。但是其中有一点问题,所以,我就想参考一下 guava 中 RateLimiter 的实现。但是发现 com.google.common.util.concurrent.RateLimiter 类上有一个 @ThreadSafe 注解。所以,本文我们先搞清楚 @ThreadSafe 的作用!
我百度谷歌了很久,都没有很好的解释。
目前我所知道的是,@Immutable、@ThreadSafe、@NotThreadSafe、@GuardedBy 都不是 JDK 的标准注释。如果我们需要使用它们,需要导入额外的依赖项:jcip-annotations.jar。
- @ThreadSafe 是表示这个类是线程安全的。具体是否真安全,那要看实现者怎么实现的了,反正打上这个标签只是表示一下。不线程安全的类打上这个注解也没事儿。
- @Immutable 表示,类是不可变的,包含了 @ThreadSafe 的意思。
- @NotThreadSafe 表示这个类不是线程安全的。如果是线程安全的非要打上这个注解,那也不会报错。
这三个注解,对用户和维护者是有益的,用户可以立即看出来这个类是否是线程安全的,维护者则是可以根据这个注解,重点检查线程安全方面。另外,代码分析工具可能会利用这个注解。
域注解和方法注解都是用@GuardedBy( lock )来标识。里面的Lock是告诉维护者:这个状态变量,这个方法被哪个锁保护着。这样可以强烈的提示类的维护者注意这里。
- @GuardedBy( "this" ) 受对象内部锁保护
- @GuardedBy( "fieldName" ) 受 与fieldName引用相关联的锁 保护。
- @GuardedBy( "ClassName.fieldName" ) 受 一个类的静态field的锁 保存。
- @GuardedBy( "methodName()" ) 锁对象是 methodName() 方法的返值,受这个锁保护。
- @GuardedBy( "ClassName.class" ) 受 ClassName类的直接锁对象保护。而不是这个类的某个实例的锁对象。
参考资料
- 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
最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!
本文原文出处:业余草: » Java 中的 @Immutable、@ThreadSafe、@NotThreadSafe、@GuardedBy 注解