背景

多个线程操作同一个对象,比如买票,这个就是不安全的

线程同步

就是多个线程进行排队

多线程操作同一个对象的时候,就是并发

队列 和 锁

上厕所需要排队,在厕所里面的人需要锁住厕所,不让其他排队的人进来

线程同步形成的条件

队列 + 锁

synchronized 的问题

线程不安全

我们之前写的代码,买票的时候,会出现有人买了负数的票,这个是不正常的,是线程不安全的

为什么会出现负数?
当只有1张票的时候,好多线程都看到还有,就把这个票拿到自己的内存,所以导致负数的出现

ArrayList 线程不安全的代码实现

思路:我们往这个list里面利用线程添加数据,比如添加1000,个数据,但是里面保存的数据不到1000,原因是多个线程往list里面保存数据的时候,有的线程可能覆盖之前线程添加的数据,导致list里面保存的数据不到1000

public class ArrayL {
   

    public static void main(String[] args)  {
   
        List<String> strings = new ArrayList<>();

        for(int i=0;i<10000;i++){
   
            new Thread(() -> {
   
                strings.add(Thread.currentThread().getName());
            }).start();

        }

        try {
   
            Thread.sleep(Long.parseLong("3000"));
        } catch (InterruptedException e) {
   
            e.printStackTrace();
        }

        System.out.println(strings.size());
    }
}

我们利用线程往list里面添加数据,循环10000次添加,但是最后list长度是9998


那么这个arraylist是线程不安全的,有一个线程把前面线程添加的数据给覆盖了

总结

线程不安全的原因就是,每一个线程的内存都是独立的,每一个线程把数据拿到自己的内存,所以互不影响