需求:
银行有一个金库。
有两个储户分别存300员,每次存100,存3次。
目的:该程序是否有安全问题,如果有,如何解决?
看如下代码,思考会出现什么问题:
class Bank {
private int sum;
public void add(int n) {
sum = sum + n;
try {Thread.sleep(10);} catch (Exception e) {}//sleep 10ms
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=200
sum=200
sum=400
sum=400
sum=600
sum=600
这很明显就是多个线程操作同一个资源 sum 导致的问题。
如何找问题:
1,明确哪些代码是多线程运行代码。
2,明确共享数据。
3,明确多线程运行代码中哪些语句是操作共享数据的。
通过以上三点,我们发现就是 add() 方法导致的。
于是我们将 add() 方法变成同步函数即可,代码如下:
class Bank {
private int sum;
public synchronized void add(int n) { //synchronized 关键字
sum = sum + n;
try {Thread.sleep(10);} catch (Exception e) {}//sleep 10ms
System.out.println("sum=" + sum);
}
}