多线程(5)
同步方法
synchronized关键字,包括两种用法:synchronized方法和synchronized块
同步方法
public synchronized void method(int args){}
银行取钱案例
卡里有100元,我取50元,别人取100元,可以取成功,卡里余额显示-50元
加入synchronized块之后便不会发生这样的情况
package com.Thread.lesson03; import javax.swing.plaf.nimbus.AbstractRegionPainter; /** * 不安全的取钱 * */ public class UnsafeBank { public static void main(String[] args) { Account account = new Account(100,"存款"); Drawing you = new Drawing(account,50,"你"); Drawing girlFriend = new Drawing(account,100,"girlFriend"); you.start(); girlFriend.start(); } } //账户 class Account{ int money; String name; public Account(int money,String name){ this.money = money; this.name = name; } } //模拟取钱 class Drawing extends Thread{ Account account; //取走的钱 int drawingMoney; int nowMoney;//手头的钱 public Drawing(Account account,int drawingMoney,String name){ super(name); this.account = account; this.drawingMoney = drawingMoney; } //取钱 @Override public void run() { synchronized (account){//用synchronized锁住 //判断有没有钱 if (account.money-drawingMoney<0){ System.out.println(Thread.currentThread().getName()+"钱不够"); return; } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } //卡内余额 account.money = account.money - drawingMoney; //手头的钱 nowMoney = nowMoney + drawingMoney; System.out.println(account.name+"余额"+account.money); //Thread.currentThread().getName()=this.getName() System.out.println(this.getName()+"手里有"+nowMoney); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!