多线程-同步函数

在写多线程同步之前我们要明确一下几个点:

1、明确那些代码是多线程的代码

2、明确共享数据

3、明确多线程运行代码中那些数据是操作共享 数据的

下面我们举例子来理解:

我们的需求是:

银行有一个吻金库。有两个储户分别存300元前,每次存100元,存3次

 

我们的目的是:该线程是否有安全问题,我们该怎么去解决(具体细节看注释)

class Bank{
private int sum;
//我们把同步关键字作为修饰符放函数上,这样我们函数就具备同步性了(同步函数)
public synchronized void add(int n){
Object obj =new Object();

//正常我们的函数的在没有加下面synchronized(){}的话函数是不具备同步性的。
// public void add(int n){
// synchronized(obj){ //这种是同步代码块
//这句话在操作共享数据,我们就同步代码块
sum = sum+n;
try{
Thread.sleep(10);
}catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("sum="+sum);
}

// }
}
class Cus implements Runnable{
private Bank b =new Bank();
public void run(){
//如果把synchronized放在这的话,如果线程t1进来了,线程t2是进不来的,要等t1存完后,t2才能存,这样就成了有序的
for(int x=0;x<3;x++){
b.add(100);
}
}
}
public 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();
}
}
posted @ 2021-11-14 23:39  滔滔是个java小白  阅读(71)  评论(0编辑  收藏  举报