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