线程同步(同步代码块 )
线程同步:为了解决线程安全问题。
1、取钱案例出现问题的原因?
多个线程同时执行,发现账户都是够钱的。
2、如何才能保证线程安全呢?
让多个线程实现先后依次访问共享资源,这样就解决了安全问题
线程同步的核心思想
加锁,把共享资源进行上锁,每次只能一个线程进入访问完毕以后解锁,然后其他线程才能进来。
线程同步解决安全问题的思想是什么?
加锁:让多个线程实现先后依次访问共享资源,这样就解决了安全问题。
同步代码块
作用:把出现线程安全问题的核心代码给上锁。
原理:每次只能一个线程进入,执行完毕后自动解锁,其他线程才可以进来执行。
synchronized(同步锁对象) {
操作共享资源的代码(核心代码)
}
锁对象要求
理论上:锁对象只要对于当前同时执行的线程来说是同一个对象即可。
锁对象用任意唯一的对象好不好呢?
不好,会影响其他无关线程的执行。
锁对象的规范要求
规范上:建议使用共享资源作为锁对象。
对于实例方法建议使用this作为锁对象。
对于静态方法建议使用字节码(类名.class)对象作为锁对象
同步代码块是如何实现线程安全的?
对出现问题的核心代码使用synchronized进行加锁
每次只能一个线程占锁进入访问
. 同步代码块的同步锁对象有什么要求?
对于实例方法建议使用this作为锁对象。
核心代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | package com.itheima.d4_thread_synchronized_code; /** 账户类:余额,卡号 */ public class Account { private String cardId; private double money; // 余额 关键信息 public Account() { } public Account(String cardId, double money) { this .cardId = cardId; this .money = money; } public String getCardId() { return cardId; } public void setCardId(String cardId) { this .cardId = cardId; } public double getMoney() { return money; } public void setMoney( double money) { this .money = money; } // // 100个线程人 // public static void run(){ // synchronized (Account.class){ // // } // } /** 小明 小红 */ public void drawMoney( double money) { // 1、拿到是谁来取钱 String name = Thread.currentThread().getName(); // 同步代码块 // 小明 小红 // this == acc 共享账户 synchronized ( this ) { // 2、判断余额是否足够 if ( this .money >= money){ // 钱够了 System.out.println(name+ "来取钱,吐出:" + money); // 更新余额 this .money -= money; System.out.println(name+ "取钱后,余额剩余:" + this .money); } else { // 3、余额不足 System.out.println(name+ "来取钱,余额不足!" ); } } } } |
锁唯一就行
synchronized ("heima") :这样一把锁 锁住了整个程序
synchronized (this) :只锁住这个账户
对于静态方法建议使用字节码(类名.class)对象作为锁对象。
1 2 3 4 5 6 | // // 100个线程人 // public static void run(){ // synchronized (Account.class){ // // } // } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY