day 26 线程同步-synchronized同步方法
线程的同步
不安全的例子
-
不安全买票
同时设定三个人买票,如果不对票进行一个操作,就会三个人同时操作同一张票,造成错误
1 public class UsafeBuy { 2 public static void main(String[] args) { 3 BuyTickets buyTickets = new BuyTickets(); 4 new Thread(buyTickets,"gugu").start(); 5 new Thread(buyTickets,"you").start(); 6 new Thread(buyTickets,"huangniu").start(); 7 } 8 } 9 10 class BuyTickets implements Runnable{ 11 12 private int ticketnum =10;//票数 13 boolean flag = true; 14 @Override 15 public void run() { 16 //买票 17 while (flag){ 18 try { 19 buy(); 20 } catch (InterruptedException e) { 21 e.printStackTrace(); 22 } 23 } 24 } 25 private void buy() throws InterruptedException { 26 if(ticketnum<=0){ 27 flag = false; 28 return;//判断是否有票 29 } 30 //模拟延时 31 Thread.sleep(100); 32 System.out.println(Thread.currentThread().getName()+" get "+ticketnum--); 33 } 34 }
-
不安全银行
两个人同时对一张银行卡取钱,如果不对银行卡设定一些操作,就会取出的钱不相符
1 public class UnsafeBank { 2 public static void main(String[] args) { 3 Account account = new Account(100,"gugu"); 4 Drawing me = new Drawing(account,50,"me"); 5 Drawing wife = new Drawing(account,100,"wife"); 6 me.start(); 7 wife.start(); 8 } 9 } 10 11 class Account{ 12 int money; 13 String name;//卡名 14 15 public Account(int money, String name) { 16 this.money = money; 17 this.name = name; 18 } 19 } 20 21 //银行 22 class Drawing extends Thread{ 23 Account account;//账户 24 //取多少钱 25 int drawingmoney; 26 //现在有多少钱 27 int nowmoney; 28 29 public Drawing(Account account,int drawingmoney,String name){ 30 super(name); 31 this.account = account; 32 this.drawingmoney = drawingmoney; 33 34 } 35 //取钱 36 37 @Override 38 public void run() { 39 //判断有没有钱 40 if(account.money-drawingmoney<0){ 41 System.out.println(Thread.currentThread().getName()+" 钱不够"); 42 return; 43 } 44 try { 45 Thread.sleep(1000); 46 } catch (InterruptedException e) { 47 e.printStackTrace(); 48 } 49 account.money -= drawingmoney; 50 nowmoney += drawingmoney; 51 System.out.println(account.name+" 余额 "+account.money); 52 System.out.println(this.getName()+" has "+nowmoney); 53 } 54 }
线程同步后安全例子
使用synchronized同步方法
使资源好像加上一个锁
-
安全买票
在买票函数前加synchronized定义
1 package gugu.Thread.demo05; 2 3 public class safeBuy { 4 public static void main(String[] args) { 5 BuyTicket buyTickets = new BuyTicket(); 6 new Thread(buyTickets,"gugu").start(); 7 new Thread(buyTickets,"you").start(); 8 new Thread(buyTickets,"huangniu").start(); 9 } 10 } 11 12 class BuyTicket implements Runnable{ 13 14 private int ticketnum =10;//票数 15 boolean flag = true; 16 @Override 17 public void run() { 18 //买票 19 while (flag){ 20 try { 21 buy(); 22 } catch (InterruptedException e) { 23 e.printStackTrace(); 24 } 25 } 26 27 } 28 //synchronized 同步方法 29 private synchronized void buy() throws InterruptedException { 30 if(ticketnum<=0){ 31 flag = false; 32 return;//判断是否有票 33 } 34 //模拟延时 35 Thread.sleep(100); 36 System.out.println(Thread.currentThread().getName()+" get "+ticketnum--); 37 } 38 }
-
安全银行
1 public class safeBank { 2 public static void main(String[] args) { 3 Accounts account = new Accounts(100,"gugu"); 4 drawing me = new drawing(account,50,"me"); 5 drawing wife = new drawing(account,100,"wife"); 6 me.start(); 7 wife.start(); 8 } 9 } 10 11 class Accounts{ 12 int money; 13 String name;//卡名 14 15 public Accounts(int money, String name) { 16 this.money = money; 17 this.name = name; 18 } 19 } 20 21 //银行 22 class drawing extends Thread{ 23 Accounts account;//账户 24 //取多少钱 25 int drawingmoney; 26 //现在有多少钱 27 int nowmoney; 28 29 public drawing(Accounts account,int drawingmoney,String name){ 30 super(name); 31 this.account = account; 32 this.drawingmoney = drawingmoney; 33 34 } 35 //取钱 36 37 //synchronized默认锁的对象是this 38 @Override 39 public void run() { 40 synchronized (account){ 41 //判断有没有钱 42 if(account.money-drawingmoney<0){ 43 System.out.println(Thread.currentThread().getName()+" 钱不够"); 44 return; 45 } 46 try { 47 Thread.sleep(1000); 48 } catch (InterruptedException e) { 49 e.printStackTrace(); 50 } 51 account.money -= drawingmoney; 52 nowmoney += drawingmoney; 53 System.out.println(account.name+" 余额 "+account.money); 54 System.out.println(this.getName()+" has "+nowmoney); 55 } 56 } 57 58 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗