JAVA多线程(四)多线程数据共享

本文通过火车票售卖和银行账户操作两个实例,演示了如何使用synchronized关键字和lock对象来确保多线程环境下共享资源的一致性和安全性。火车票模型展示了简单的计数递减过程,而银行问题则涉及存款、取款及转账等复杂操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前在这个系列的第一篇博客 JAVA多线程(一)基本概念和上下文切换性能损耗中,提到过多线程之间共享数据很方便。那么,究竟怎么做呢?

1 火车票模型

模型说明:购买火车票有多种方式,每种方式在同一时刻看到的剩余票数必须是相同的,而且每个线程执行的核心代码都是给票数减一。

  public class Ticket implements Runnable{  
      private int ticket = 10;  
      public static Object obj=new Object();
      public void run() {  
          synchronized(obj){
          while(ticket>0){  
              ticket--;  
              System.out.println("当前剩余票数为:"+ticket);  
          }
          }            
      }   
  }  
  public class TicketSeller {  
      public static void main(String[] args) {  
           Ticket t = new Ticket();  
           new Thread(t).start();  
           new Thread(t).start();  
      }   
  }  

2 银行问题

与火车票模型只做减法不同,银行模型要求既可以取钱,也可以存钱(也就是要实现deposit和withdraw方法),而且每次不是加一或者减一那么简单,存入或者取出的数额应该由用户在代码中输入。同时,也可以加入转账功能,从一个账户扣钱加到另一个账户。

class BankAccount {
    private decimal balance = 0.0M;
    public static Object obj=new Object();
    internal void Deposit(decimal amount) {
        lock (obj) { balance += amount; }
    }
    internal void Withdraw(decimal amount) {
        lock (obj) {
            if (balance < amount)
                throw new Exception("余额不足");
            balance -= amount;
        }
    }
    internal void Transfer(BankAccount a, BankAccount b, decimal amount) {
        lock (a.obj) {
            lock (b.obj) {
                Withdraw(a.amount);
                Deposit(b.amount);
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值