背景
多个线程操作同一个对象,比如买票,这个就是不安全的
线程同步
就是多个线程进行排队
多线程操作同一个对象的时候,就是并发
队列 和 锁
上厕所需要排队,在厕所里面的人需要锁住厕所,不让其他排队的人进来
线程同步形成的条件
队列 + 锁
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是线程不安全的,有一个线程把前面线程添加的数据给覆盖了
总结
线程不安全的原因就是,每一个线程的内存都是独立的,每一个线程把数据拿到自己的内存,所以互不影响