线程之函数同步
/** * 同步的第二种方式-->同步函数 * * 需求:储户,两个,每个都到银行存钱每次存100,共三次 * * 分析:1.要有一个银行-->金库的钱每次存进去可以增加 * 2.要有封装运行任务的线程类 * @author 罗摩衔那 * */ class Banck { //金库初始金钱为0,考虑到现实中金库是不对外暴露的,故用private修饰 private int vault; /** * 方式二:函数同步 * 由于在Cus的run方法中,add方法一同进栈 * 因此也属于线程任务,只需给函数方法加上同步性质即可 * @param sum */ public synchronized void add(int sum) //定义sum变量为存进的资金 { vault+=sum; System.out.println(Thread.currentThread().getName()+"..."+vault); } } class Cus implements Runnable { Banck b=new Banck();//创建一个银行对象,代表存的是同一个银行 Object o=new Object(); public void run() { // 方法一:上同步锁 synchronized (o) // { for(int i=1;i<=3;i++) //要存三次 { b.add(100); //调用了Banck的add方法代表了add函数也属于线程运行任务 } // } } } public class Syschronization_Function { public static void main(String[] args) { Cus c=new Cus();//创建线程封装任务对象 //下面两个线程对象代表是两个不同的人存钱 Thread t1=new Thread(c); Thread t2=new Thread(c); t1.start(); t2.start(); } }
温馨小提示:在本示例中创建两个线程对象代表的是两个不同的人,至于传入Cus对象,是为了在开启线程时,调用同一个run方法(干同一件事-->存钱),在run方法中封装的就是存钱的任务,需要创建银行对象才能调用其中的add方法,加入在run中创建银行对象,两个线程进入就会创建两次银行对象-->存的是不同银行.因为我们总是说对象是类的实例化.此时可以在if函数块封装入同步代码块中(本质就是一个函数代码块).其实线程任务不仅仅只局限于run方法中-->比如在本例中,add函数代码块就随run一起进栈,所有add也属于线程任务的一部分,也就是说我们也可以把下面两行代码封装进同步函数代码块中
synchronize(obj)
{ vault+=sum; System.out.println(Thread.currentThread().getName()+"..."+vault);
}
我是直接给add函数代码块加上同步性质了
其实,我写博客是给自己看的,纯碎是为了加深记忆,不会写的很详细勒