并发系列1:并发基础知识
本文是Java并發(fā)系列的開(kāi)篇,主要講一些并發(fā)的計(jì)算機(jī)基礎(chǔ)知識(shí)。本系列所講的知識(shí)框架也是基于《Java并發(fā)編程的藝術(shù)》一書,所講的內(nèi)容也多圍繞于并發(fā)concurrent包下的類。
?
正文
并發(fā)的前提是多線程間的協(xié)同運(yùn)作,如果是程序是單線程運(yùn)作并發(fā)也無(wú)從談起。那么首先要理解兩個(gè)問(wèn)題。
什么是進(jìn)程、線程?
答:進(jìn)程是程序的運(yùn)行過(guò)程,有內(nèi)存空間、CPU運(yùn)行時(shí)間、IO設(shè)備,進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位。
線程是CPU獨(dú)立運(yùn)行和獨(dú)立調(diào)度的基本單位,一個(gè)進(jìn)程里可以擁有多個(gè)線程,進(jìn)程空間包括不同線程可共同訪問(wèn)的公共空間和私有空間。
Java開(kāi)啟多線程的方式?
1、裝配runnable接口,重寫run()方法。
2、繼承Thread類,重寫它的Start方法。
Java線程狀態(tài)?
Java線程間的協(xié)作方式?
顯然,不進(jìn)行協(xié)作的多線程它們的作用要大打折扣,而線程協(xié)作關(guān)注的兩個(gè)重要問(wèn)題是Java線程間如何進(jìn)行通信以及線程間如何進(jìn)行同步?
Java采用的共享內(nèi)存模型,線程間通過(guò)正確同步和讀寫共享內(nèi)存數(shù)據(jù)達(dá)到線程通信和同步的目的,當(dāng)然要正確的讀寫共享內(nèi)存絕不是容易的事情,它包括了很多并發(fā)知識(shí)。但我們現(xiàn)在只要建立這種認(rèn)知就夠了。
Java間有以下協(xié)作的方式:1、等待通知機(jī)制(Synchronized和object配合、Lock和Condition配合)
2、volatile
3、synchronized
4、管道流
它們直接的詳細(xì)內(nèi)容會(huì)在后文講到。
為什么會(huì)出現(xiàn)并發(fā)結(jié)果不一致問(wèn)題?
為什么沒(méi)有正確編寫程序會(huì)引發(fā)并發(fā)問(wèn)題?這跟計(jì)算機(jī)底層運(yùn)行機(jī)制有關(guān)。
1、重排序問(wèn)題(重排序?yàn)榱颂岣叱绦蜻\(yùn)行效率),Java重排需只保證了單線程的結(jié)果一致性,沒(méi)有保證多線程結(jié)果一致性,保證多線程結(jié)果一致性的是happens-before規(guī)則。重排序包括編譯器重排序、指令集重排序、CPU重排序,它們都會(huì)讓多線程出現(xiàn)并發(fā)問(wèn)題。
2緩存問(wèn)題,首先Java線程通信是采用共享內(nèi)存的方式通信,A線程將數(shù)據(jù)寫入主內(nèi)存,B線程從主內(nèi)存讀取數(shù)據(jù)以達(dá)到通信目的。系統(tǒng)為了提高效率建立了緩存,它導(dǎo)致了線程和共享內(nèi)存間的通信并不是即時(shí)的,所以會(huì)出現(xiàn)并發(fā)問(wèn)題。
Java本身也只是保證了as-if-serial語(yǔ)言,即保證單線程程序運(yùn)算結(jié)果不會(huì)改變。而對(duì)于多線程結(jié)果不改變的語(yǔ)義happens-before語(yǔ)義則只保證正確同步的程序結(jié)果不變。
Java保證并發(fā)Volatile、Sychronized關(guān)鍵字和CAS操作起到了關(guān)鍵作用,它們的知識(shí)點(diǎn)在下篇文章:
? ? ? ?https://www.cnblogs.com/llsblog/p/10629168.html
?
轉(zhuǎn)載于:https://www.cnblogs.com/llsblog/p/10629119.html
總結(jié)
以上是生活随笔為你收集整理的并发系列1:并发基础知识的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 微信小程序_(表单组件)button组件
- 下一篇: [图像处理] 直方图均衡化原理 - 数学