来看下面这个程序
/*
需求:
银行有一金库。有两个储户分别存300元,每次存100,存3次。
目的:该程序是否有安全问题。如果有,如何解决?
*/
class Bank
{
private int sum;
public void add(int n)
{
sum = sum + n;
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();
}
}
运行结果可能为:
如何找问题:
1.明确哪些代码是多线程运行代码
2.明确共享数据
3.明确多线程运行代码中哪些语句是操作共享数据的
在上面的运行程序中,
run方法和add方法是多线程运行代码
b和sum是共享数据
操作b的是b.add(100); 操作sum的是sum = sum + n;和System.out.println("sum = "+sum);
先用同步代码块封装代码
class Bank
{
private int sum;
Object obj = new Object();
public void add(int n)
{
synchronized(obj)
{
sum =