携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情
上篇文章使大家明白了线程调度在java层面玩不了,因为java没有线程的概念,真正调用的是C++的方法,说白了就是映射到操作系统层面,来进行线程调度。
那我们这篇继续来介绍多线程,我们用多线程是为了可以异步处理很多任务,但是多线程的问题很多,而且比较难以调试,常见的就是线程安全问题。
线程安全
因为线程的数据集是共享的,大家一起并行执行就会出现问题,你比如下面这段代码:
我们跑一下:
看见没,出现问题了,出现什么问题了呢,消费者1线程导入了一个文件,但消费者3线程不知道啊,所以就又导入1个文件,这就是线程安全问题。
同步
那怎么解决呢?聪明的你肯定想到了,同步啊,对,那我们试一下:
是不是这样就行了呢?我们跑一下:
你不管跑多少次,三个线程只有一个线程在跑,因为谁先抢到锁,谁先跑,跑完这整个任务就执行完了啊,另外两个线程再拿到锁,已经不满足条件了,这显然不是我们想要的。聪明的你又想到了,加里面。
行了嘛?我们跑一下:
怎么多出两个文件呢?我们来分析一下:线程1、2、3枪锁,线程1拿到3次,打印3次,然后释放锁,此时线程2抢到锁,由于是判断过再抢锁,所以就不用判断了,打印一次,再判断,条件不满足,释放锁,然后线程3也是一样,说明我们需要加锁后再判断。
就像这样:
那while里面的判断没有意义,所以搞成true就可以了。