当前位置: 首页 > news >正文

线程安全相关的注解

      主要有下面三个加在类上的线程安全相关的注解。

一.@Immutable

        标记一个类为不可变的。这意味着该类的实例在构造完成后,其状态(数据)永远不能被更改。实现不可变性的严格条件(Java内存模型中的定义):

  1. 所有字段都是 final 的:这确保了在构造函数执行完毕后,所有字段的引用对其他线程是可见的(通过 final 的语义保障),并且引用不能再指向其他对象。

  2. 类本身被声明为 final:防止子类覆盖其方法并意外地改变状态(“破坏性继承”)。

  3. this 引用没有逸出:在构造函数执行期间,this 引用不能提供给其他代码,防止其他代码在对象完全构造之前就看到它。

  4. 对可变状态的正确管理

    如果类包含对可变对象的引用(例如,一个 final List<String>),那么必须:
  • 如果需要返回内部可变状态,返回其防御性拷贝,而不是原始引用。
  • 不要提供任何可以修改这些可变状态的方法(如setter)。
  • 在构造函数中,深度拷贝任何传入的可变参数,而不是直接存储其引用。

下面是注解源码:

       可以发现有两个地方存在@Immutable注解,它们的来源不一样,我们应该使用第一个并发包下的注解。第二个不太稳定。

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//package javax.annotation.concurrent;import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Documented
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.CLASS)
public @interface Immutable {
}
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//package jdk.nashorn.internal.ir.annotations;public @interface Immutable {
}

总结

  • javax.annotation.concurrent.Immutable:是公共的、受支持的、有用的并发编程工具注解,用于文档化和静态分析。

  • jdk.nashorn.internal.ir.annotations.Immutable:是内部的、已废弃的、特化的JDK实现细节注解,与应用程序开发无关。

二.@ThreadSafe

       标记一个类是线程安全的。这意味着该类的实例可以在多线程环境下被安全地并发使用,其内部方法会维护状态的一致性。

实现方式(多种途径):

  1. 无状态:类没有任何字段,自然是线程安全的。(如:只包含静态工具方法的类)。

  2. 使用不可变状态:即类本身是 @Immutable 的。

  3. 使用内置锁 (synchronized):通过同步方法或同步代码块来保护所有访问状态的临界区。

  4. 使用并发容器:例如,使用 ConcurrentHashMap 代替 HashMap,使用 AtomicInteger 代替 int

  5. 使用显式锁 (java.util.concurrent.locks.Lock):提供更灵活的锁定机制。

       下面是concurrent包下的注解源码。(其实java中还有别的@ThreadSafe注解,问题与上面一个注解类似,有不同的来源,主要使用下面这个)

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//package javax.annotation.concurrent;import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Documented
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.CLASS)
public @interface ThreadSafe {
}

三.@NotThreadSafe

       明确标记一个类是非线程安全的。这意味着该类的实例不能在多线程间共享,除非由调用者通过外部手段(如外部同步)来协调访问。

为什么需要它?

  • 默认情况:Java中的大多数类(如 ArrayListHashMapStringBuilder)默认都是非线程安全的,以实现最佳性能。

  • 明确警示:加上此注解是一个非常好的实践,它明确地告诉使用者:“注意!这个类不是线程安全的,你不能直接在多线程环境下使用它”,避免了潜在的误用和难以发现的并发Bug。

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//package javax.annotation.concurrent;import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Documented
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.CLASS)
public @interface NotThreadSafe {
}

文章转载自:

http://d7BWwSMS.tqfnf.cn
http://7CzfX2PW.tqfnf.cn
http://YDwHZsNO.tqfnf.cn
http://nN67W57l.tqfnf.cn
http://wEdgCC1O.tqfnf.cn
http://l3Vx3VLd.tqfnf.cn
http://OcrZuItl.tqfnf.cn
http://vp6t1eqb.tqfnf.cn
http://8DnWDd8d.tqfnf.cn
http://Zc9nt3vt.tqfnf.cn
http://w9xLcZ4S.tqfnf.cn
http://wacJHRZF.tqfnf.cn
http://vLZNlChA.tqfnf.cn
http://BB7RZzIf.tqfnf.cn
http://sSV2FB2t.tqfnf.cn
http://OTv6Pd16.tqfnf.cn
http://WciASxL9.tqfnf.cn
http://5OUeWXOO.tqfnf.cn
http://QKD2kvVa.tqfnf.cn
http://tL85prE9.tqfnf.cn
http://ogrCoR0K.tqfnf.cn
http://qdbNAnOi.tqfnf.cn
http://KnWiNqrb.tqfnf.cn
http://JELeiYKA.tqfnf.cn
http://aPb6zmSA.tqfnf.cn
http://omHGR8iv.tqfnf.cn
http://ynVECcLh.tqfnf.cn
http://4T49c3Ib.tqfnf.cn
http://KHY6GJkM.tqfnf.cn
http://5aKbMzS4.tqfnf.cn
http://www.dtcms.com/a/378766.html

相关文章:

  • [超表面论文快讯-242] PR-微波超四元数涡旋阵列洛书加权锁定成像加密-江南大学王继成、上海科技大学王雄团队
  • 质量特性工程
  • 性能测试-jmeter10-分布式测试
  • Java中方法重写与重载的区别
  • 【代码随想录算法训练营——Day9】字符串——151.翻转字符串里的单词、卡码网:55.右旋转字符串、28.实现 strStr()、459.重复的子字符串
  • 少儿舞蹈小程序(13)作品播放量累加及点赞
  • 【AI知识点】模型训练优化之——混合精度训练
  • 华为考试:HCIE数通考试难度分析
  • OpenHarmony app通过U盘升级配置
  • mobx-miniprogram小程序的数据传输
  • rdKafka驾驭手册:从青铜到王者的异步消息屠龙术
  • Ubuntu\Linux环境中驱动版本配置cudaToolKit
  • 法规变更后研发文档更新不及时该怎么办
  • linux 时间相关的命令
  • ThreadLocal 线程本地变量源码深度解析
  • 虚拟化技术(1):虚拟化技术的演进、挑战与突破
  • AWS strands agents 当智能体作为独立服务/容器部署时,它们无法共享进程内状态
  • 云手机与云游戏之间有什么关系?
  • 数据库学习MySQL系列3、Windows11系统安装MySQL方法二.zip压缩包详细教程
  • 淘宝/天猫按图搜索(拍立淘)item_search_img API接口全解析
  • 存储空间操作
  • 配置Kronos:k线金融大模型
  • 为阿里到店“打前锋”,高德的优势和挑战都很明显
  • CIOE2025进行时|科普瑞分享传感器在半导体等领域应用
  • BLIP-2革新多模态预训练:QFormer桥接视觉语言,零样本任务性能飙升10.7%!
  • WhatWeb-网站安全扫描指纹识别
  • 【LeetCode 每日一题】498. 对角线遍历——(解法一)模拟
  • LeetCode2 两数相加 两个链表相加(C++)
  • 项目1——单片机程序审查,控制系统项目评估总结报告
  • 科技行业新闻发布平台哪家好?多场景推广专业方案服务商推荐