多线程与reentrantlock锁相关的死锁问题

llk102b 发布于 2014/09/26 14:30
阅读 639
收藏 0
@Test
    /**
     * 会发生死锁
     */
    public void conditionTest() {
        final int NUM = 10;
        final int[] i = {NUM};
        final int[] index = {0};
        final Lock lock = new ReentrantLock();
        final Condition out = lock.newCondition();
        final Condition in = lock.newCondition();
        ExecutorService pool = Executors.newFixedThreadPool(3);
        for (int j = 0; j < 10; j++) {

            pool.execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        lock.lock();
                        System.out.print("第" + (++index[0]) + "次操作:");
                        if (i[0] <= 0) {
                            System.out.println("没有啦,请等待");
                            try {
                                out.await();
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                        System.out.println("取出:1,还剩:" + --i[0]);
                        in.signalAll();
                    } finally {

                        lock.unlock();
                    }

                }
            });

                 /* try {
                            Thread.sleep(100);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }*/
            pool.execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        lock.lock();
                        System.out.print("第" + (++index[0]) + "次操作:");
                        if (i[0] > NUM - 1) {
                            System.out.println("满啦,请等待");
                            try {
                                in.await();

                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                        System.out.println("存入:1,还剩:" + (++i[0]));
                        out.signalAll();
                        /*try {
                            Thread.sleep(100);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }*/
                    } finally {

                        lock.unlock();
                    }

                }
            });

        }
        pool.shutdown();

    }

在Intellij运行,结果:
第1次操作:取出:1,还剩:9
第2次操作:存入:1,还剩:10
第3次操作:取出:1,还剩:9
第4次操作:存入:1,还剩:10
第5次操作:取出:1,还剩:9
第6次操作:存入:1,还剩��10
第7次操作:取出:1,还剩:9
第8次操作:存入:1,还剩:10
第9次操作:取出:1,还剩:9
第10次操作:存入:1,还剩:10
第11次操作:取出:1,还剩:9
第12次操作:存入:1,还剩:10
Process finished with exit code 0

总是运行不完就结束了,我的判断是有可能死锁了导致的。还请各位帮忙看下。谢谢

 

以下是问题补充:

@llk102b:我又做了一系列其他测试,觉得这不是锁的问题,这有可能是线程池的问题。 (2014/09/26 15:04)
加载中
0
c
catch23
是不是用的Junit跑的,可能任务执行完之前Junit的线程已经结束了。
0
许式阳
是不是你的编译环境问题啊?我用你的代码测试了,可以执行完的,每次都是20次操作结束。
0
许式阳
我是用Eclipse执行的
0
page_zxy
page_zxy

如果是死锁,就不会执行下去了,都僵持住了

返回顶部
顶部