黑马程序员技术交流社区

标题: 多线程问题 [打印本页]

作者: 谭荣强    时间: 2014-2-13 23:27
标题: 多线程问题
我无意中把  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();
               
        }
}

作者: 630681386@qq.co    时间: 2014-2-14 00:03
同步代码块,要共用同一个锁,放在add方法中的话每个线程都会调用这个方法,说明每个线程都有自己单独的锁,当然同步失败了,放在add方法外面就变成公共的了。
作者: 林发明    时间: 2014-2-14 11:37
楼上正解

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





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