• 线程之函数同步


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

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

  • 相关阅读:
    [洛谷P2523] HAOI2011 Problem c
    [CF156D] Clues
    [洛谷P4769] NOI2018 冒泡排序
    [CF605E] Intergalaxy Trips
    [洛谷P4492] HAOI2018 苹果树
    [洛谷P3349] ZJOI2016 小星星
    [洛谷P4336] SHOI2016 黑暗前的幻想乡
    [洛谷P5364] SNOI2017 礼物
    [洛谷P2606] ZJOI2010 排列计数
    [洛谷P6078] CEOI2004 candy
  • 原文地址:https://www.cnblogs.com/zjm1999/p/9879759.html
Copyright © 2020-2023  润新知