java并發(fā)編程 學(xué)習(xí)筆記

記一下學(xué)習(xí)過程的覺得需要注意的點(diǎn)吧

第二章、線程安全性

無狀態(tài)對(duì)象一定是線程安全的
內(nèi)置鎖是可重入的,就是說獲得鎖的操作的粒度是一個(gè)『線程』,而不是一個(gè)『調(diào)用』。
synchronized 函數(shù),是對(duì)類的實(shí)例加鎖。

第三章、對(duì)象的共享

在程序中,可能編譯過程中會(huì)進(jìn)行重排序。就是對(duì)代碼中的執(zhí)行順序可能進(jìn)行改變,這樣的優(yōu)勢是充分利用流水線的作用。 (這個(gè)有點(diǎn)可怕呀)

volatile
關(guān)鍵字可以保證變量的可見性,因?yàn)閷?duì)volatile
的操作都在Main Memory中,而Main Memory是被所有線程所共享的,這里的代價(jià)就是犧牲了性能,無法利用寄存器或Cache。volatile
還有一個(gè)作用就是局部阻止重排序的發(fā)生

對(duì)于非volatile類型的64位數(shù)值變量double和long
jvm允許將64位的讀操作和寫操作分解成兩個(gè)32位的操作,所以不考慮失效數(shù)據(jù)的問題,在多線程中共享
可變的long和double也是不安全的,除非用volatile來聲明他們。(這個(gè)也要注意下,可能webApi中,會(huì)修改一個(gè)全局變量,這個(gè)時(shí)候long的修改可能會(huì)讀到一個(gè)錯(cuò)誤的值)

在構(gòu)造函數(shù)中最好不要新建一個(gè)線程并啟動(dòng),可以吧啟動(dòng)放在后續(xù)的函數(shù)中。因?yàn)榭赡茉跇?gòu)造完成之前,線程就會(huì)訪問到this的值。

線程封閉

  • ad-hoc線程封閉
    這個(gè)好像說完全自己在代碼里注意
  • 棧封閉
    相當(dāng)于用局部變量
  • Threadlocal類
    不同線程調(diào)用的一個(gè)Threadlocal變量不一樣
第四章、對(duì)象的組合

沒啥,主要注意加鎖的時(shí)候,要加在一個(gè)鎖上面,不要加錯(cuò)了

第五章、基礎(chǔ)構(gòu)建模塊

Hashtable和Vector是同步容器
創(chuàng)建一個(gè)同步List Collections.synchronizedList(new ArrayList<Object>());

通過并發(fā)容器來代替同步容器,可以極大的提高伸縮性并降低風(fēng)險(xiǎn)
接下來介紹了一些并發(fā)容器:

  • cuncurrentHashMap 使用的是分段鎖,實(shí)現(xiàn)了額外的原子操作,類似相等則移除之類的,保障他的迭代器不會(huì)影響。
  • copyOnWriteArrayList 每次修改的時(shí)候都會(huì)把底層數(shù)組復(fù)制一遍,這樣保障他的迭代器不會(huì)影響。
  • LinkBlockList ArrayBlockList.是FIFO隊(duì)列
  • PriorityBlockingQueue 是一個(gè)優(yōu)先級(jí)的隊(duì)列
  • 雙端隊(duì)列 Deque ,可以實(shí)現(xiàn),生產(chǎn)者首先讀取自己的隊(duì)列,空了再去別人的隊(duì)列尾部開始工作,降低了隊(duì)列的競爭程度

中斷
首先,忘掉Thread.stop方法。雖然它確實(shí)停止了一個(gè)正在運(yùn)行的線程,然而,這種方法是不安全也是不受提倡的,這意味著,在未來的JAVA版本中,它將不復(fù)存在。
中斷線程最好的,最受推薦的方式是,使用共享變量(shared variable)發(fā)出信號(hào),告訴線程必須停止正在運(yùn)行的任務(wù)。
因此,如果線程Object.wait, Thread.join和Thread.sleep三種方法之一阻塞,正確的停止線程方式是設(shè)置共享變量,并調(diào)用interrupt()(注意變量應(yīng)該先設(shè)置)。如果線程沒有被阻塞,這時(shí)調(diào)用interrupt()將不起作用;否則,線程就將得到異常(該線程必須事先預(yù)備好處理此狀況),接著逃離阻塞狀態(tài)。在任何一種情況中,最后線程都將檢查共享變量然后再停止。Listing C這個(gè)示例描述了該技術(shù)。
http://www.cnblogs.com/simonshi/archive/2011/12/31/2308455.html 這個(gè)講的還可以

同步工具類

  • CountDownLatch是一種靈活的閉鎖實(shí)現(xiàn),await會(huì)一直阻塞到,值為0.countDown會(huì)把值減1(閉鎖,門一開始是關(guān)閉的,等待所需要的資源都初始化之后,會(huì)打開,并且一直打開)
  • FutureTask,Callable。一種有結(jié)果的Runnable.future.get() 可以獲得
  • 信號(hào)量Semaphore
  • CyclicBarrier 感覺和countDownLatch差不多,只是可以重復(fù)使用
第六章、任務(wù)執(zhí)行

Executor 任務(wù)執(zhí)行框架
如果在程序中實(shí)現(xiàn)一個(gè)生產(chǎn)者消費(fèi)者的設(shè)計(jì),那么最簡單的方式就是使用Executor

延時(shí)任務(wù)和周期性任務(wù)
Timer類和ScheduledThreadPoolExecutor。
Timer有一些缺陷,Timer在執(zhí)行任務(wù)時(shí)只會(huì)創(chuàng)建一個(gè)線程,如果某個(gè)任務(wù)執(zhí)行時(shí)間過長,將會(huì)影響其他的TimerTask的精確性。而且如果TimerTask拋出了一個(gè)未檢查的異常,那么Timer將變現(xiàn)出糟糕的行為。
在java 5.0或更高的jdk中,將很少使用Timer。

如果要構(gòu)建自己的調(diào)度系統(tǒng),可以使用DelayQueue。(可以設(shè)置過期時(shí)間,然后take的時(shí)候,只能取出到了時(shí)間的)

可以用ExecutorService的submit(callable a)方法來得到一個(gè)Future,然后future.get()得到返回值。但是這里所有的都會(huì)在future.get()處等待
可以使用ExecutorCompletionService來進(jìn)行處理,在提交多個(gè)task之后,起一個(gè)輪訓(xùn),取completion.take(),這樣可以獲取完成了的線程。

為任務(wù)設(shè)置時(shí)限:
1.可以使用future.get(long timeout, TimeUnit unit),然后catch住TimeOutException

對(duì)于要對(duì)多個(gè)futureTask設(shè)定實(shí)現(xiàn),可以使用invokeAll(List<Callable> **, long timeOut, TimeUtil unit)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • layout: posttitle: 《Java并發(fā)編程的藝術(shù)》筆記categories: Javaexcerpt...
    xiaogmail閱讀 6,024評(píng)論 1 19
  • 線程池 策略 當(dāng)線程數(shù)量未達(dá)到核心線程數(shù)量,直接啟動(dòng)一個(gè)核心線程來執(zhí)行任務(wù)。 如果線程數(shù)量已達(dá)到或者超過核心線程的...
    liaowenhao閱讀 575評(píng)論 0 1
  • 一.線程安全性 線程安全是建立在對(duì)于對(duì)象狀態(tài)訪問操作進(jìn)行管理,特別是對(duì)共享的與可變的狀態(tài)的訪問 解釋下上面的話: ...
    黃大大吃不胖閱讀 972評(píng)論 0 3
  • 現(xiàn)在沒工作,每天做著白日夢,夢著自己突發(fā)大財(cái),買了套房子,養(yǎng)了一堆動(dòng)物,掐指一算,我此生多半是廢了
    眼淚_閱讀 290評(píng)論 0 0
  • 文/小賤 1 時(shí)間過得真快,這兩眼一閉雙腿一蹬就到了周一,又到悲催的上班時(shí)間了!生活不易,好好加油吧! 不過令人高...
    賤公子閱讀 1,258評(píng)論 0 1

友情鏈接更多精彩內(nèi)容