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

详解 synchronized 关键字【通俗易懂】

一、前言

  • synchronized 关键字是 Java 实现线程同步的核心机制。
  • 用于解决多线程环境下的资源竞争问题,保证线程安全

二、关键作用

1.同步方法

public class Counter {private int count = 0;// 同步方法(实例方法)public synchronized void increment() {count++;}// 同步静态方法public static synchronized void staticMethod() {// 操作静态变量}
}
  • 实例方法:锁对象是当前实例(this),同一时刻只有一个线程能访问该实例的同步方法
  • 静态方法:锁对象是类的 Class 对象(如 Counter.class),锁住所有调用该静态方法的线程

2.同步代码块

public void doSomething() {// 非同步代码synchronized(this) { // 锁对象可以是任意对象// 需要同步的代码}
}
  • 更细粒度控制,允许仅同步关键代码段(临界区)
  • 锁对象可以是 this、Class 对象或自定义对象

三、实际应用(代码示例)

  • 假设需要对银行账户进行相关操作:
class BankAccount {private int balance = 1000;// 同步取款方法public synchronized void withdraw(int amount) {if (balance >= amount) {System.out.println(Thread.currentThread().getName() + " 取款:" + amount);balance -= amount;}}public int getBalance() {return balance;}
}public class Main {public static void main(String[] args) throws InterruptedException {BankAccount account = new BankAccount();// 创建两个线程同时取款Thread t1 = new Thread(() -> {for (int i = 0; i < 100; i++) {account.withdraw(10);}}, "线程1");Thread t2 = new Thread(() -> {for (int i = 0; i < 100; i++) {account.withdraw(10);}}, "线程2");t1.start();t2.start();t1.join();t2.join();System.out.println("最终余额:" + account.getBalance()); // 正确结果应为 0}
}

四、关键特性

  • 可重入性:线程获得锁后可以重复获取同一把锁 。
  • 内存可见性:synchronized 会触发内存屏障,保证变量修改对后续线程可见
  • 互斥性:同一时刻只有一个线程能持有锁。

五、注意事项

  • 避免锁住非 final 对象(可能被重新赋值导致锁失效) 。
  • 不要锁字符串常量(可能与其他代码意外共享锁) 。
  • 优先使用同步代码块缩小同步范围 。
  • Java 5+推荐使用 java.util.concurrent 包中的更高级并发工具(如 ReentrantLock)。
  • 通过合理使用 synchronized,可以有效解决多线程环境下的线程安全问题。
  • 过度使用会导致性能下降,需在安全性和性能之间权衡。
http://www.xdnf.cn/news/107083.html

相关文章:

  • 前端常见问题
  • 西门子S7-200SMART 控制Profinet闭环步进MD-4250-PN (1)电机及专栏介绍
  • 基于百度地图 MCP Server规划规划一次青岛到北京旅行的详细行程实践
  • Vue3集成百度实时语音识别
  • 【Redis】集合类型Set 常用命令详解
  • ZLMediaKit支持JT1078实时音视频
  • 新手村:正则化
  • 系统架构师2025年论文《系统架构风格》
  • Airflow全局异常捕获实现消息通知实践
  • LeetCode-46. 全排列
  • 洛谷P3196C语言题解
  • PHP CURL发送POST请求(支持HEADER参数配置)
  • Kubernetes 集群内访问外部服务的三种实践方案
  • 软件工程的13条“定律”:从Hyrum定律到康威定律,再到Zawinski定律
  • 锤子线,买入准确概率是多少
  • leetcode-数组
  • Retrofit框架分析(二):注解、反射以及动态代理,Retrofit框架动态代理的源码分析
  • bert学习
  • AIGC的伦理困境:机器生成内容是否该被监管?
  • 动态脚本引擎QLExpress,实现各种复杂的业务规则
  • 深度学习驱动的车牌识别:技术演进与未来挑战
  • 创建第一个Spring Boot项目
  • pytorch(gpu版本安装)
  • Javase 基础入门 —— 04 继承
  • 数据结构与算法学习笔记(Acwing提高课)----动态规划·数字三角形
  • openssh-10.0p1用于修复CVE-2025-26465、CVE-2025-26466
  • java springBoot 整合 扣子cozeAI 智能体 对话
  • AI 人工智能模型:从理论到实践的深度解析⚡YQW · Studio ⚡【Deepseek】【Chat GPT】
  • python函数与模块
  • PyCharm 链接 Podman Desktop 的 podman-machine-default Linux 虚拟环境