Java中 枚举类中定义的方法怎么用 synchronized 保证线程安全

冰川箭仙

冰川箭仙

2026-07-19

633人浏览

原创

枚举类本身线程安全,但操作共享可变状态(如static字段或可变成员变量)时需同步;实例方法加synchronized锁当前常量,适合保护其私有状态;静态方法加synchronized锁class对象,适用于全局共享数据;同步代码块可精准控制锁粒度,关键在于锁住正确的共享可变状态。

java中 枚举类中定义的方法怎么用 synchronized 保证线程安全

枚举类本身是线程安全的单例集合,但其中定义的方法如果操作共享状态(比如静态字段、外部资源或可变成员变量),仍需显式同步。关键不在于“能不能用 synchronized”,而在于“要不要用、锁什么、怎么用才有效”。

枚举实例方法加 synchronized:锁的是当前枚举常量

枚举的每个常量都是独立对象,synchronized 修饰实例方法时,锁的是调用该方法的具体枚举值(如 Color.REDColor.BLUE)。这意味着不同常量之间互不影响,但同一常量被多线程反复调用时,能保证该常量内部逻辑的串行执行。

  • 适合场景:方法只修改或依赖该枚举常量自身的私有状态(比如缓存计算结果、维护计数器)
  • 不适合场景:多个枚举常量共用同一个静态变量,此时锁单个实例无法保护全局共享数据

静态方法加 synchronized:锁的是枚举类的 Class 对象

若方法操作的是 static 字段(例如所有枚举值共用的计数器、配置缓存),必须用 synchronized static 方法synchronized (MyEnum.class) 块。这样所有线程竞争同一把锁,确保对静态资源的互斥访问。

  • 示例:统计某个枚举值被调用次数,且该计数器是 static int totalCount
  • 错误做法:仅给实例方法加 synchronized —— 每个枚举值用自己的锁,totalCount 仍会并发写冲突

同步代码块:精准控制锁粒度与锁对象

更灵活的方式是用 synchronized(XXX) 显式指定锁对象。常见选择包括:

Java JDK 25
Java JDK 25

Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。

下载
  • synchronized (MyEnum.class):等效于静态同步,保护整个枚举类级别的共享状态
  • synchronized (this):等效于实例方法加 synchronized,保护当前枚举常量的私有状态
  • synchronized (someSharedLock):使用单独的 final Object 作为锁,便于解耦和测试

注意:避免用可变对象(如字符串字面量、数组)作锁,也别在枚举方法里锁 new Object() —— 每次新建对象等于没锁。

真正要防的不是“方法”,而是“共享可变状态”

synchronized 的作用对象从来不是方法签名,而是方法体中读写的共享可变数据。枚举类中:

  • 枚举常量本身不可变(final),无需保护
  • 枚举字段如果是 final 或不可变类型(如 String、Integer),通常也不需要同步
  • 只有当方法修改了 static 变量、或某个枚举常量持有的非 final 可变字段时,才需要加锁

换句话说:没有共享可变状态,加 synchronized 是多余的;锁错了对象(比如该锁 class 却锁了 this),等于没锁。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

3792

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

2796

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

2824

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

637

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

602

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

705

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1290

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

18844

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

646

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

Java 26官方文档
Java 26官方文档

共0课时 | 0人学习