当前位置: 首页 > 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,可以有效解决多线程环境下的线程安全问题。
  • 过度使用会导致性能下降,需在安全性和性能之间权衡。

相关文章:

  • GPLT-2025年第十届团体程序设计天梯赛总决赛题解(2025天梯赛题解,266分)
  • nginx部署前端项目时,正常访问前端页面成功后,浏览器刷新报404解决访问
  • Android开发常用外部组件及使用指南(下)
  • 【自我介绍前端界面分享】附源码
  • java后端开发day35--集合进阶(四)--双列集合:MapHashMapTreeMap
  • 深入剖析PHP反弹Shell:OSCP场景下的实现、原理与优化
  • sql 根据时间范围获取每日,每月,年月的模版数据
  • MOS管驱动电路以及阻值选取
  • rl中,GRPO损失函数详解。
  • VulnHub-DarkHole_2靶机渗透教程
  • DCAN,ECAN和MCAN的区别
  • 基于SpringBoot的校园二手商品在线交易系统+含项目运行说明文档
  • UniGoal 具身导航 | 通用零样本目标导航 CVPR 2025
  • ABP-Book Store Application中文讲解 - Part 0:开发环境搭建
  • 创建第一个Spring Boot项目
  • 文案提取有错别字怎么办?
  • QT之Q_PROPERTY介绍以及在QWidget中的用法
  • 武汉昊衡科技OLI光纤微裂纹检测仪:高密度光器件的精准守护者
  • 基于Python爬虫的豆瓣电影信息爬取(可以根据选择电影编号得到需要的电影信息)
  • GPLT-2025年第十届团体程序设计天梯赛总决赛题解(2025天梯赛题解,共计266分)
  • 外交部:中方在黄海暂定海域建造渔业养殖设施,同中韩海域划界无关
  • 法治日报:强制统一店铺广告牌匾事件何以频发?
  • 主刀完成3万余例手术,81岁神经外科学专家徐启武逝世
  • 搜索市场战火延伸:OpenAI虎视眈眈,欲收购谷歌浏览器
  • 钟芳玲|戴耳环的莎士比亚
  • 七大外贸省市,靠什么撑起一季度的出口?