需求:两个储户,每个都到银行存钱,每次存100,一共存三次。
public class BankDemo {
public static void main(String[] args) {
Cus cus=new Cus();
Thread thread1=new Thread(cus);
Thread thread2=new Thread(cus);
thread1.start();
thread2.start();
}
}
class Bank {
private int sum;//总数
public void add(int num){
sum=sum+num;
System.out.println(sum);
}
}
class Cus implements Runnable{
Bank bank=new Bank();
@Override
public void run() {
for (int i = 0; i < 3; i++) {
bank.add(100);
}
}
}
200
300
400
200
500
600
Process finished with exit code 0
我们发现结果出现了线程安全问题。
解决方法一 加同步代码块
class Bank {
Object obj=new Object();
private int sum;
public void add(int num){
synchronized (obj) {//同步代码块
sum = sum + num;
System.out.println(sum);
}
}
}
解决方法二 使用同步函数
class Bank {
Object obj=new Object();
private int sum;
public synchronized void add(int num){
sum = sum + num;
System.out.println(sum);
}
}
同步函数使用的锁为this。
两种方法都能解决同步安全问题。