摸鱼少学习多

day 26 线程同步-synchronized同步方法

线程的同步

不安全的例子

  1. 不安全买票

同时设定三个人买票,如果不对票进行一个操作,就会三个人同时操作同一张票,造成错误

 
复制代码
 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. 不安全银行

两个人同时对一张银行卡取钱,如果不对银行卡设定一些操作,就会取出的钱不相符

 
复制代码
 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同步方法

使资源好像加上一个锁

  1. 安全买票

在买票函数前加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. 安全银行

复制代码
 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  }
复制代码

 

 

posted @   北海之上  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
/* 粒子吸附*/
点击右上角即可分享
微信分享提示