线程不安全案例

本文探讨了两个Java编程实例,一是如何因线程不安全导致自动售票机卖票异常,以及二是ArrayList在高并发下列表长度不符预期的问题。通过这两个案例揭示了并发编程中的数据竞争和一致性问题,以及线程安全的重要性。
摘要由CSDN通过智能技术生成

案例一:自动售票机

package com.UnSafeDemo;

public class sellTickets extends Thread{

    @Override
    public void run() {
        sell();
    }

    private int tickets = 3;
    public static void main(String[] args) {
        sellTickets machine = new sellTickets();
        new Thread(machine,"张三").start();
        new Thread(machine,"李四").start();
        new Thread(machine,"黄牛党").start();
    }
    void sell()
    {

        while (this.tickets>0)
        {
            System.out.println(Thread.currentThread().getName()+"买走了第"+tickets+"张票");
            tickets--;
        }
    }
}


我们让三个买票的线程张三、李四、黄牛党同时在售票机前买票。票的数量用tickets来存储。出现了以下异常的数据
在这里插入图片描述
由于票具有唯一性,同一张票不可能卖给不同的人。所以程序存在线程不安全的情况。

案例二:ArrayList线程不安全案例

package com.UnSafeDemo;

import java.util.ArrayList;

public class ArrayListDemo {
    public static void main(String[] args) throws InterruptedException {
        ArrayList list = new ArrayList();
        for (int i = 0; i < 100000; i++) {
            new Thread(
                    ()->{
                        list.add(Thread.currentThread().getName());
                    }
            ).start();
        }
        Thread.sleep(3000);
        System.out.println(list.size());
    }
}

以上案例我们声明了一个ArrayList的对象,在10000次的for循环中,我们每次都声明一个线程,线程的run方法用lamda表达式重写,方法体为每次向ArrayList中添加当前线程的名字。
最后我们让主线程休眠3秒以等待循环的结束,最后输出List的长度。
在我们脑海中,由于执行了10000次循环体,所以List长度应该为10000
然而真实的List的长度却并没有达到10000
在这里插入图片描述
这是由于ArrayList是线程不安全的,不同的变量i所对应的循环体内的操作可能操作了同一线程所导致的安全隐患。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值