(转自:https://blog.csdn.net/antony9118/article/details/51482397 侵删)

之前在这个系列的第一篇博客 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);
            }
        }
    }
}