线程之函数同步

/**
 * 同步的第二种方式-->同步函数
 * 
 * 需求:储户,两个,每个都到银行存钱每次存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函数代码块加上同步性质了

其实,我写博客是给自己看的,纯碎是为了加深记忆,不会写的很详细勒

原文地址:https://www.cnblogs.com/zjm1999/p/9879759.html