同步代码块--银行的例子

来源:互联网 发布:php旅游网站文献 编辑:程序博客网 时间:2024/06/05 15:21

需求:
银行有一个金额sum。
有两个储户分别存钱,每次存100,存3次。

目的:该程序是否有安全问题,如果有,如何解决?

如何找问题:
1,明确哪些代码是多线程运行代码。
2,明确共享数据。
3,明确多线程运行代码中哪些语句是操作共享数据的。

class Bank{    private int sum;    Object obj = new Object();    public void add(int n)  {        synchronized(obj){            sum = sum + n;            try{Thread.sleep(10);}catch(Exception e){}            System.out.println("sum="+sum);        }    }}class Cus implements Runnable{    private Bank b = new Bank();    public void run(){              for(int x=0; x<3; x++){            b.add(100);        }    }}class  BankDemo{    public static void main(String[] args){        Cus c = new Cus();        Thread t1 = new Thread(c);        Thread t2 = new Thread(c);        t1.start();        t2.start();    }}
  • 共享数据是sum
  • 同步代码是{6,7,8},{17}行,所以将6,7,8 行加锁
0 0