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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 谭荣强 高级黑马   /  2014-2-13 23:27  /  1477 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我无意中把  Object obj = new Object(); 创建在了add方法中,结果synchronized同步失败,为什么?


/*
需求:
银行有一个金库。
有两个账户分别存300元,每次存100,存3次。
目的;检查该程序是否有安全问题,如果有,如何解决?

如何找问题;
1.明确哪些代码是多线程运行代码。、
2.明确共享数据
3.明确多线程运行代码中哪些语句是操作共享数据的。
*/
class Bank
{
        private int sum ;
        Object obj = new Object();
        public void add(int n)
        {
                Object obj = new Object();//此处不可以创建对象吗
                synchronized (obj)
                {
                        sum = sum +n;
                        try{Thread.sleep(10);}catch(Exception e){}
                        System.out.println(" sum ="+sum);
                }
        }
}
class Account implements Runnable
{
        private Bank b = new Bank();
        public void run()
        {       
                for (int x =0;x<3 ;x++ )
                {
                        b.add(100);
                }
        }
}

class  day1110
{
        public static void main(String[] args)
        {
                Account a = new Account();
                Thread t1 = new Thread(a);
                Thread t2 = new Thread(a);
                t1.start();
                t2.start();
               
        }
}

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

2 个回复

正序浏览
楼上正解

同步的前提:
1,        必须要有两个以上的线程
2,        必须是多个线程使用同一个锁
3,        必须保证同步中只能有一个线程在运行。

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
同步代码块,要共用同一个锁,放在add方法中的话每个线程都会调用这个方法,说明每个线程都有自己单独的锁,当然同步失败了,放在add方法外面就变成公共的了。

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马