A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小冰块 高级黑马   /  2013-6-6 22:59  /  2180 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 小冰块 于 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();
        }
}


评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

5 个回复

倒序浏览
放在add方法里面就是局部变量,每次调用时候都会产生新的对象,所以就不会同步、、、

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
你的不同的线程分别执行了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(); 所以  两个线程都能看到这个共同的对象 所以 是一个锁

评分

参与人数 1技术分 +1 收起 理由
刘凯 + 1 很给力!

查看全部评分

回复 使用道具 举报
张歆明 发表于 2013-6-7 00:27
你的不同的线程分别执行了run 是吧  run里面调用了add方法吧  这样 每个线程执行add的方法 都会在内存开辟 ...

解释的很清楚,谢谢。
回复 使用道具 举报
yin1031468524 发表于 2013-6-6 23:21
放在add方法里面就是局部变量,每次调用时候都会产生新的对象,所以就不会同步、、、 ...

原来是这样,我明白了,谢谢
回复 使用道具 举报
小冰块 发表于 2013-6-7 00:33
解释的很清楚,谢谢。

哈哈 不客气 帮到你 我很高兴 嘿嘿
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马