[Java] 线程之并发与同步

使用多线程的目的通常是为了提高并发性,这就不可避免的出现了线程同步的问题。在研究如何解决线程同步问题之前,必须先弄清楚什么是线程同步,为什么需要线程同步。很好的明白事物的原因,才能更好的解决问题。我们先来讲清楚这些概念和问题。

并发

并发是指两个或多个事物在同一时间间隔内发生。简单的理解就是在同一段时间内发生了多个事情。这里需要着重指出的是一个时间段,而不是一个时刻。比如一个处理器同一时刻只能做一件事情,但是电脑却可以同时做很多事情,比如一边放音乐,一边下电影等。整个电脑表现出来的就是并发性,很多事情同时在进行。但是我们只有一个处理器,它是通过把时间分片的机制来实现的。第一片时间来做A事情,第二片时间做B事情,第三片时间做C事情等,这样循环往复的执行,这样在一段时间内处理器同时做着多个事情,但在一个时间点上,处理器只做一件事情。从宏观上讲,多个事情在同时断断续续的进行着,对外表现就是放一会音乐,下一会电影,再放音乐,再下电影。但是我们并没有感觉出来它们之间的这种交替过程,我们感觉到的是它们在同时进行的,音乐一直在放着,电影一直在下着。并没有一会停顿,一会继续。那是因为处理器的频率非常高,所以单位时间非常小,我们人类根本分辨不出来。就像日常的白炽灯,它使用的是50赫兹的交流电,即每秒中电流的方向改变50次,每次改变电压都会从波峰经过0再到波谷,在电压为0的时候灯是不会发光的,电压在波峰或波谷处灯发的光是最亮的。它的理论表现就像汽车的转向灯一样,一闪一灭。但事实上我们感觉到的是一直在亮。因为他的闪灭周期只有0.02秒,再加上人的眼睛具有延时功能,所以正常情况感觉不到。

同步

很多人认为同步指的就是同时,可能因为在宏观开了同步很多时候就表现就同时,就像并发在宏观下表现为并行。其实这样理解是不正确的。同步中的同,不是同时的意思,而是指的协同、协调。同步中的步,指的是步骤、步调。合起来就是协同或协调步骤或步调。就是多个事物的步调遵循一定的规范,而不是混乱不堪的。多个事物按照一定的规律进行着,可以是一个事物先进性一段时间,然后另一个事物再进行,也可以是一个事物进行完后,另一个事物再进行。总之要有一个规律把所有事物约束起来。

线程的并发和同步

在同一时间间隔内有多个线程在同时执行,就是线程的并发。多个线程在逻辑上互有前因后果的关系,所以要对他们的执行顺序进行控制和协调,这就是线程同步。系统为了提高性能和吞吐量,采用了多线程并发来解决,但同时也引入了线程同步的问题。可以这样理解线程并发和同步的因果关系。

如果线程在时间上能够区分开来,比如线程A先执行,在指定时间后,能够执行完毕或产生我们想要的结果,这时线程B使用线程A的结果作为输入开始执行。像这样通过时间能够严格的加以区分的不是特别复杂的线程关系,可以让线程休眠指定的时间来进行同步。就是采用sleep方法实现同步。

如果线程在时间上不能区分开,但是在先后顺序上能够区分开,比如线程A先执行,我们不知道它什么时候能够执行完,但是我们知道它必须执行完后线程B才能开始执行。像这样在执行的先后顺序上能够严格的区分开的,而起前一个执行完,后一个才开始的,可以使用join方法来实现同步。

如果线程的执行比较复杂,交织在一起,那么只能通过等待和通知,即wait和notify方法来实现线程的同步,采用这种方式能够更加灵活的控制线程的步调,但是如果使用不慎的话会容易导致更大的问题。具体采用哪种同步方式要根据实际情况。如果你的同步过于发杂的话,最好还是重新进行算法和逻辑的设计,因为只有良好的设计,才可能会出现巧妙的实现,最终成就健康稳定的运行。

你可能感兴趣的:(Java线程)