多线程之线程安全问题

线程安全

讲到线程安全 enn。。。。怎么说呢 这是一个很复杂的东西 --算了直接上代码吧
文章中 有些我也是复制的不过我不像别人看都不看 我都看过一边觉得对的我才会复制

public class SecurityThead {

    private static int num=0;

    //10个线程,使用线程工具类
    private static CountDownLatch countDownLatch = new CountDownLatch(10);

    private static void addNum(){
        num++;
    }

    public static void main(String[] args) {
        for (int i=0;i<10;i++){
            new Thread(()->{
                for(int j=0;j<100;j++){
                    addNum();
                    try {
                        Thread.sleep(10L);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                countDownLatch.countDown();
            }).start();
        }

        while(true){
            if(countDownLatch.getCount()==0){
                System.out.println(num);
                break;
            }
        }



    }


CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务。
在这里插入图片描述
输出结果不是1000欸 为什么呢

多个线程执行时,CPU对线程的调度是随机的,我们不知道当前程序被执行到哪步就切换到了下一个线程,所以就会发生线程不安全的情况

有不对的地方欢迎指出来

喜欢的话请点个关注

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值