首先什么是多线程? (多线程并不是一定会存在数据安全问题。)
线程是进程中的概念,可以理解为一个进程中,多个程序代码同时运行(其实不是同时运行,是cpu轮流执行这些程序,只不过cpu速度非常快,给人的感觉是同时运行而已)。
这些程序如果是不同的代码,就不会存在数据安全问题。如果是同一段代码,就会有数据安全问题。
用形象的比喻来理解线程:
线程可以理解为路径,进程中都会有一条main路径。多线程就是开辟了多条路径,多条路径如果各自跑不同的代码,就不存在数据安全问题。
如果多条路径跑同一段代码,就可能发生数据不安全的情况(如:同一个数据被多个线程同时拿到。。。好吧,大概就这一种情况)。
如何确保数据安全?就是让线程排队进入这段代码。两种方式:1、synchronized 2、lock给这段代码加锁。
说这个类是安全的,就是说多线程环境下,跑了这个类中的同一段代码,这段代码加了同步或者锁,从而确保了线程安全。
LinkedBlockingQueue中维持两把锁,一把锁用于入队,一把锁用于出队,这也就意味着,同一时刻,只能有一个线程执行入队,其余执行入队的线程将会被阻塞;同时,可以有另一个线程执行出队,其余执行出队的线程将会被阻塞。换句话说,虽然入队和出队两个操作同时均只能有一个线程操作,但是可以一个入队线程和一个出队线程共同执行,也就意味着可能同时有两个线程在操作队列,那么为了维持线程安全,LinkedBlockingQueue使用一个AtomicInterger类型的变量表示当前队列中含有的元素个数,所以可以确保两个线程之间操作底层队列是线程安全的,这个在后面源码分析的时候会说明。