一、同步的作用:就是为了保证共享资源的前后一致性。
二、判断需要用到同步代码的地方
1.这些代码会在多线程中运行
2.要明确是否有共享数据,或者共享对象,共享方法,共享属性
3。哪些代码是操作这么共享数据的。
这个例子会出现的问题:在add方法执行后,cpu被切换走,线程1还来不及把返回的数据打印,这时进入到线程2,又执行了add方法sum值又一次改变。这时候cpu切换回了线程1,继续执行打印语句。这时候就会打印错误信息。打印的值是线程2执行后的sum的值。并笔试第一次线程1执行后的值。解决方法就是将add方法改成同步函数。
银行例子:
实体类bank----------------------------------
public class Bank {
private double sum=0;
public synchronized double add(double money){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
sum=sum+money;
return sum;
}
}
Runable类,(在线程中运行的代码)--------------------------
class BankRunnable implements Runnable{
private Bank bank;
public BankRunnable(Bank bank){
this.bank=bank;
}
@Override
public void run() {
for(int i=0;i<3;i++){
System.out.println("银行现在有:"+this.bank.add(100)+"元");
}
}
测试方法--------------------------------------
public static void main(String[] args) {
BankRunnable br=new BankRunnable(new Bank());
Thread t1=new Thread(br);
Thread t2=new Thread(br);
t1.start();
t2.start();
} |