黑马程序员技术交流社区

标题: 银行业务调度系统中同步死锁思考 [打印本页]

作者: 谢毅    时间: 2013-1-16 20:13
标题: 银行业务调度系统中同步死锁思考
本帖最后由 谢毅 于 2013-1-17 16:40 编辑

Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
                        public void run() {
                                Integer number = NumberMachine.getInstance().getCommonManager()
                                                .generateNewManager();
                                System.out.println(number + "号普通客户等待服务");
                        }
                }, 0, Constants.COMMON_CUSTOMER_INTERVAL_TIME, TimeUnit.SECONDS);
                Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
                        public void run() {
                                Integer number = NumberMachine.getInstance()
                                                .getExpressManager().generateNewManager();
                                System.out.println(number + "号快速客户等待服务");
                        }
                }, 0, Constants.COMMON_CUSTOMER_INTERVAL_TIME * 2, TimeUnit.SECONDS);
                Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
                        public void run() {
                                Integer number = NumberMachine.getInstance().getVipManager()
                                                .generateNewManager();
                                System.out.println(number + "号VIP客户等待服务");
                        }
                }, 0, Constants.COMMON_CUSTOMER_INTERVAL_TIME * 6, TimeUnit.SECONDS);

3个调度线程需要进行同步,老张也说过,不过说用两个锁去做很可能死锁,因为其中的generateNewManager()也是阻塞状态。
我想了下是不是可以用Lock和Condition去取代两个锁,不过还没实现,求各位大虾建议

作者: 王少雷    时间: 2013-1-16 21:08
楼主你可以去看一下API 这个类 Executors的 newScheduledThreadPool这个静态方法,很犀利的。
会自动释放线程池的,专门用于多线程同时执行时,自动释放等待线程的,不会出现的哦。
作者: 王阳    时间: 2013-1-16 21:33
银行业务系统我记得是将获取号码的两个方法进行了同步,而Numbermachine里并没有进行同步,只是建了三个对象,并且NumberMachine使用单利模式,所以,并不存在你说的问题莫,如果要用Lock锁的话,只要将生成号码和获得号码进行加锁。由于我记得不是很清楚了,如果号码是在一个ArrayList保存,那么将这个List是为监听对象即可。
作者: 谢毅    时间: 2013-1-16 21:45
王阳 发表于 2013-1-16 21:33
银行业务系统我记得是将获取号码的两个方法进行了同步,而Numbermachine里并没有进行同步,只是建了三个对象, ...

MainClass启动类里,分别开辟了3个调度线程来供3种客户取号,这里应该要同步的,因为只有一台机子可供操作,每个取号线程里又调用了NumberManager类的号码生成方法,这个方法也是被同步了的,所以我说出现了两个锁
作者: 王阳    时间: 2013-1-16 22:28
谢毅 发表于 2013-1-16 21:45
MainClass启动类里,分别开辟了3个调度线程来供3种客户取号,这里应该要同步的,因为只有一台机子可供操 ...

是的,所以我不是说了莫,Numbermachine里面分别实现了三个对象,而NumberMachnie又是单利模式,所以不会出现什么问题。因为NumberMachine只会有一个实例对象,那么对应的三个取号对象都是唯一的。何来需要同步呢?只需要同步方法即可
作者: 焦健    时间: 2013-1-17 10:45
王阳 发表于 2013-1-16 22:28:29

是的,所以我不是说了莫,Numbermachine里面分别实现了三个对象,而NumberMachnie又是单利模式,所以不会出现什么问题。因为NumberMachine只会有一个实例对象,那么对应的

不对吧,张老师的意思是在获取要服务的号码以后在这里线程就停止了,有可能并没有直接输出某某等待服务这一输出语句!!




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