fork并發(fā)編程 大家都說java不好學(xué),到底難在哪呢?
大家都說java不好學(xué),到底難在哪呢?我覺得JAVA的難點在于廣度!大家都知道JAVA入門很容易。通過學(xué)習(xí)基本類型、基本操作、面向?qū)ο蟮乃季S和IO,就可以開發(fā)大部分JAVA程序!那為什么難呢?以多線程
大家都說java不好學(xué),到底難在哪呢?
我覺得JAVA的難點在于廣度!
大家都知道JAVA入門很容易。通過學(xué)習(xí)基本類型、基本操作、面向?qū)ο蟮乃季S和IO,就可以開發(fā)大部分JAVA程序!
那為什么難呢?以多線程為例,多線程可以通過簡單的實現(xiàn)一個線程或者一個真正的Runnble接口來實現(xiàn),但是我怕你誤用線程造成性能問題,所以我給你一個完整的線程池來實現(xiàn)線程復(fù)用,但是線程池的創(chuàng)建有幾種類型:singleton,動態(tài),周期性任務(wù)執(zhí)行!
而且用了多線程之后,因為線程共享資源,所以會有wire安全問題吧?我們做什么呢鎖,同步鎖,鎖方法,鎖對象,鎖代碼段,鎖被鎖,不得不說性能不好。做一個CAS和AQS實現(xiàn)重入鎖!
這時,傲慢的人來了,說他沒有 我不想鎖它。我該怎么辦?ThreadLocal給你每個線程一個變量好嗎?所以數(shù)據(jù)不會互相影響!用BlockingQueue逐個處理總行吧!
多線程里還有CountDownBatch,valetile,parallel computing,F(xiàn)utrueTask,F(xiàn)orkjoin,都不是省油的燈!
上面說的多線程只是J.U.C包下的冰山一角,多線程只是JAVA下的冰山一角!
而且,JAVA開發(fā)最難的不僅僅是JAVA語言,還有JAVA生態(tài)。從事JAVA的人都知道以下幾點:
搜索引擎有l(wèi)ucence,solr和elasticSearch!
數(shù)據(jù)庫里有hibernate,mybatis,mycat,druid,canel!
緩存里有redis,memcache,ehcache!
消息中間件包括redis,activ
c 如何并行編程?
1.c沒有專門的并行編程模式,但是可以多線程多進程模擬。2.例如,在linux下,可以使用fork函數(shù)來調(diào)用一個新進程。分叉函數(shù)是計算機程序設(shè)計中的分叉函數(shù)。返回值:成功調(diào)用一次,返回兩個值,子進程返回0,父進程返回子進程標(biāo)志;否則,錯誤返回-1。fork函數(shù)將正在運行的程序分成兩個(幾乎)相同的進程,每個進程進入過程啟動一個線程,該線程從代碼中的相同位置開始執(zhí)行。這兩個進程中的線程繼續(xù)執(zhí)行,就好像兩個用戶同時啟動了應(yīng)用程序的兩個副本。函數(shù)原型pid_t fork( void) (pid_t是一個宏定義,本質(zhì)是在# incultsys/types . HGT中定義了int)返回值:如果成功調(diào)用一次,則返回兩個值,子進程返回0,父進程返回子進程ID;否則,錯誤返回到-1函數(shù),表明現(xiàn)有的進程可以調(diào)用fork函數(shù)來創(chuàng)建新的進程。fork創(chuàng)建的新進程稱為子進程。fork函數(shù)被調(diào)用了一次,但返回了兩次。兩次返回的唯一區(qū)別是子進程返回值0,而父進程返回子進程ID。子進程是父進程的副本,它將獲得父進程的數(shù)據(jù)空間、堆、棧等資源的副本。注意,子進程持有一個 "復(fù)制 "的存儲空間,這意味著父進程和子進程不共享這些存儲空間。UNIX會把父進程地址空間的內(nèi)容復(fù)制到子進程,所以子進程有一個獨立的地址空間。在不同的UNIX (Like)系統(tǒng)下,無法確定fork之后是先運行子進程還是先運行父進程,這取決于系統(tǒng)的實現(xiàn)。所以你不應(yīng)該。;移植代碼時不要做任何假設(shè)。