黑马程序员技术交流社区

标题: 线程同步的一点疑问 [打印本页]

作者: 小冰块    时间: 2013-6-6 22:59
标题: 线程同步的一点疑问
本帖最后由 小冰块 于 2013-6-7 00:32 编辑

看完毕老师11-11的视频后自己敲代码,中间出了点差错,虽然后来对着老师的代码改过来了,但是不知道为什么是这样。详细请看代码注释

class Bank
{
        private static int  sum;
        Object obj = new Object();//-------------Object放在这里可以实现同步
        public void add(int x)
        {
           //Object obj = new Object(); -------------Object放在这里就不能同步了
                synchronized(obj)
                {
                        sum = sum + x;
                        try
                        {Thread.sleep(10);}
                        catch (Exception e)
                        {}
                        System.out.println(sum);                        
                }
        }
}

class Cus implements Runnable
{
        Bank b = new Bank();
        
        public void run()
        {
                for (int i=0;i<3 ;i++ )
                {
                        b.add(100);
                }
        }
}


class  BankDemo
{
        public static void main(String[] args)
        {
                Cus s = new Cus();
                Thread t1 = new Thread(s);
                Thread t2 = new Thread(s);

                t1.start();
                t2.start();
        }
}



作者: yin1031468524    时间: 2013-6-6 23:21
放在add方法里面就是局部变量,每次调用时候都会产生新的对象,所以就不会同步、、、
作者: 张歆明    时间: 2013-6-7 00:27
你的不同的线程分别执行了run 是吧  run里面调用了add方法吧  这样 每个线程执行add的方法 都会在内存开辟自己的空间 来存放这些变量和对象  add方法内部的Object obj = new Object();  属于不同线程的引用和方法   所以  对应不用的堆内存区域  虽然名字一样 但是  彼此不可见  ,每个线程只能看到自己的Object obj = new Object();  所以  不是同一个obj  肯定不是一个锁了
但是  Cus是实现了Runnable接口  每个线程都是Cus c =new Cus(); Thread t2 =new Thread(c);Thread t1 =new Thread(c); 两个线程公用同一个Cus类的实例c  而这个c的成员就有Object obj =new Object(); 所以  两个线程都能看到这个共同的对象 所以 是一个锁
作者: 小冰块    时间: 2013-6-7 00:33
张歆明 发表于 2013-6-7 00:27
你的不同的线程分别执行了run 是吧  run里面调用了add方法吧  这样 每个线程执行add的方法 都会在内存开辟 ...

解释的很清楚,谢谢。
作者: 小冰块    时间: 2013-6-7 00:33
yin1031468524 发表于 2013-6-6 23:21
放在add方法里面就是局部变量,每次调用时候都会产生新的对象,所以就不会同步、、、 ...

原来是这样,我明白了,谢谢
作者: 张歆明    时间: 2013-6-7 00:39
小冰块 发表于 2013-6-7 00:33
解释的很清楚,谢谢。

哈哈 不客气 帮到你 我很高兴 嘿嘿




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2