首页 新闻 会员 周边

求JAVA多线程高手解答,一个关于验证Java多线程不安全的代码问题,困扰我好几天了,

0
悬赏园豆:200 [已解决问题] 解决于 2020-11-09 14:15

这是要测试的线程不安全的类

正常情况下,使用下面线程池测试上面的代码,结果并不是100,也就是说明线程不安全

但使用下面的这个代码,结果总是100,也就是线程安全,但明明是不安全的呀

public static void main(String[] args) throws InterruptedException {
            El el = new El();
            final int threadSize = 100;

            final CountDownLatch countDownLatch = new CountDownLatch(threadSize);
            ExecutorService executorService = Executors.newCachedThreadPool();
            for (int i = 0; i < threadSize; i++) {
                executorService.execute(() -> {
                    el.add();
                    countDownLatch.countDown();
                });
            }
            Thread.sleep(100);
            System.out.println(el.get());

            //另一个测试代码
           Runnable r = new Runnable() {

                @Override
                public  void run() {

                        el.add();


                }
            };
            Thread threads[]=new Thread[100];
            for (int i = 0; i < 100; i++) {

                threads[i] = new Thread(r," " + i);
            }
            for (int i = 0; i < 100; i++) {
                threads[i].start();
            }


            Thread.sleep(1000);
            System.out.println(el.get());

        }

EL类

public class El {
    public int count = 0;

    public  void add() {

           count += 1;

       }

    public int get() {
        return count;
    }
}
GeekLIfi的主页 GeekLIfi | 初学一级 | 园豆:2
提问于:2020-11-08 10:36
< >
分享
最佳答案
0

threads[i].start 这个代码需要执行的时间比较长, 但是 el.run 函数执行非常短, 可能导致没有同时运行的情况
可以在 el.run 函数 中添加多些循环执行测试代码

另外el.run 函数代码只有增加值, 没有减少值

收获园豆:100
Yofoo | 菜鸟二级 |园豆:394 | 2020-11-08 16:55

我明白了,因为线程池启动多个线程比较快,造成了线程的同时执行,所以结果不等于100, 而我写的for循环执行多个线程比较慢,造成后面的线程还没启动,前面的就执行完了,就体现不了并发了,所以结果总是等于100

谢谢帮忙解答,

GeekLIfi | 园豆:2 (初学一级) | 2020-11-09 14:15
其他回答(1)
0

如果我没猜错;每次执行,会输出两个结果,第一个结果 100 ;第二个结果 200;每次都是一样的。我想你的写法是有问题的,第一句打印的时候,那部分100条线程已经执行完毕了,所以是100;第二句打印语句还是100条线程;也是执行完毕之后才打印语句。这个,能测试出什么东西?

收获园豆:100
明日小路 | 园豆:466 (菜鸟二级) | 2020-11-09 09:00

有一点说错了,因为执行很快;所以才会是100、200;你可以进行休眠试试,执行一定量的睡眠,就休眠 一两秒,就可以看出差异

支持(0) 反对(0) 明日小路 | 园豆:466 (菜鸟二级) | 2020-11-09 09:49

@南小鸟:
是,随机休眠后第二个就出现问题了,(另外我是分别测试的,第一用线程池测,另一个自己写的)

我明白了,因为线程池启动多个线程比较快,造成了线程的同时执行,所以结果不等于100, 而我写的for循环执行多个线程满,造成后面的线程还没启动,前面的就执行完了,就体现不了并发了,所以结果总是等于100

最后谢谢帮忙解答,

支持(0) 反对(0) GeekLIfi | 园豆:2 (初学一级) | 2020-11-09 14:13
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册