好程序员Java学习路线之Java并发

时间:2021-09-20 15:33:46

好程序员Java学习路线之Java并发,什么是并发?用户通常认为计算机在同一时刻可以做多个事情是理所当然的事情。

1:例如你可以一边听音乐,一边玩游戏,同时还通过聊天工具和别人聊天。假设你使用的q-q音乐播放器在听音乐,玩的是q-q斗地-主游-戏,使用q-q和别人聊天,那么这实际上是三个不同的软件在同时运行,完成三个不同的事情。

2:当然我们也不能否认,在一个软件内,同时可以完成以上三个事情:聊天、游戏和音乐。例如你在玩q-q斗-地主,以便在打牌,播放了背景音乐,同时你还可以和其他牌友聊天,发一句"我等的花儿也谢了",这实际上是一个软件可以同时完成三个不同的事情

  不管是那种情况,我们应该知道的是,并发指的是在同一时刻执行多个任务。  

java并发基础

线程本身有很多优势,比如可以发挥多处理器的强大能力、建模更加简单、简化异步事件的处理、是用户界面的相应更加灵敏,但是更多的我们面对的是安全性问题,例如:

public class Concurrence{

    private int value;

    /*返回一个唯一的数值*/

    public int getValue(){

        return value++;

    }

}

Concurrence的问题在于,如果执行时机不对,那么两个线程在调用getValue时会得到相同的值,错误示范:

好程序员Java学习路线之Java并发

虽然递增运算value ++ 看上去是单操作,但是它包含了三个独立的操作: 读取Value、value + 1 、计算结果写入Value。由于运行,可能将多个线程之间的操作交替执行,因此这两个线程可能同事执行读取操作,从而使它们得到相同的值,并都将这个值加1。结果就是,在不同线程的调用中返回了相同的值。

Concurrence中说明的是一种常见的并发安全问题,称为竞态条件。当某个计算的正确性取决于多个线程的交替执行时序时,那么就会发生竞态条件。

Java并发性和多线程介绍

在过去单CPU时代,单任务在一个时间点只能执行单一程序。之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程。虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个CPU,并交由操作系统来完成多任务间对CPU的运行切换,以使得每个任务都有机会获得一定的时间片运行。

随着多任务对软件开发者带来的新挑战,程序不在能假设独占所有的CPU时间、所有的内存和其他计算机资源。一个好的程序榜样是在其不再使用这些资源时对其进行释放,以使得其他程序能有机会使用这些资源。

再后来发展到多线程技术,使得在一个程序内部能拥有多个线程并行执行。一个线程的执行可以被认为是一个CPU在执行该程序。当一个程序运行在多线程下,就好像有多个CPU在同时执行该程序。

多线程比多任务更加有挑战。多线程是在同一个程序内部并行执行,因此会对相同的内存空间进行并发读写操作。这可能是在单线程程序中从来不会遇到的问题。其中的一些错误也未必会在单CPU机器上出现,因为两个线程从来不会得到真正的并行执行。然而,更现代的计算机伴随着多核CPU的出现,也就意味着不同的线程能被不同的CPU核得到真正意义的并行执行。

如果一个线程在读一个内存时,另一个线程正向该内存进行写操作,那进行读操作的那个线程将获得什么结果呢?是写操作之前旧的值?还是写操作成功之后的新值?或是一半新一半旧的值?或者,如果是两个线程同时写同一个内存,在操作完成后将会是什么结果呢?是第一个线程写入的值?还是第二个线程写入的值?还是两个线程写入的一个混合值?因此如没有合适的预防措施,任何结果都是可能的。而且这种行为的发生甚至不能预测,所以结果也是不确定性的。