閱讀351 返回首頁    go 阿裏雲 go 技術社區[雲棲]


測試小花花重口味java多線程,慎入。。。。。

下麵內容,參考《Java高並發程序設計》書籍。

寫在前麵:能不用多線程就不用多線程,我們的分布式架構,已經是物理多線程了。

Tip1:並發與並行:

並發是存在臨界區競爭的,宏觀上同時,微觀上有先後,所以,才有鎖的概念。去東莞,進了屋,要上鎖。完事了,出門釋放鎖,下一個哥們再來。

艸,本來要寫一篇正經的,又下道兒了。。。。。。

並行是兩條平行線,比如多核CPU就是並行的,單核的就不行,一次cpu隻能執行一個命令,所謂一心不能二用。

Tip2:死鎖,活鎖

死鎖:哥在廁所玩手機,心想沒人敲門我就不出來,門外KK很有禮貌,門不開,就不進去。然後我倆就相互等待,最後我得了痔瘡,KK拉了褲襠.......

活鎖:哥和DD一起去廁所,發現就一個坑,我說你先來,他說你先來,我說你先來,他說你先來,我說你先來,他說你先來...... 最後我們都拉了褲襠

Tip3:並發控製策略

阻塞:大號一般都有鎖,完事兒了,開門解鎖,下一個繼續,門外等的一般都拿起手機,被掛起。

無饑餓:無論多牛逼,優先級多高的人物,沒有特殊通道,必須乖乖排隊,這樣所有的人都可以去廁所,沒有人餓著。小米搶手機....

無阻礙:到斯卡拉小包間兒不鎖門,YY推門一進來,老妹兒就說,大哥旁邊看一會兒,現在都在忙呀。YY急的不行,隔會兒就問快點兒,好沒,好沒。。。。等同於樂觀鎖。

無等待:哥們去買上好的玉鐲,隻有一對兒,好幾個買主。這時店主很聰明,做了一堆仿品,讓我們幾個先看著,最終哪個確認買了,在給誰真的進行交易。等同於RCU鎖,適用於讀多寫少。

Tip4:要不要多線程

amdahl定律:加速比= 優化前係統耗時/優化後係統耗時
如果係統中沒有能可被並行化的代碼,這多線程毫無意義

Tip5:JavaMM的根本特性

原子性:兩個線程互相不會幹擾對方的操作,如A線程int i = 1 B線程int i= -1 ,那麼無論如何執行,i 要麼是1 要麼是-1 而32位的long型就不是這樣,會出現很多意外的值。

可見性:指令重排會讓變量的賦值發生順序變化,所以,線程之間觀測變量是否有保證,是我們設計多線程要考慮的。

有序性:如果不遵循Happen-before原則,比如

class OrderExample
{

int a = 0 ;
boolean flag = false;

public void writer()
{
    a = 1;
    flag = true;
}

public void reader()
{
   if(flag)
      {
init i = a + 1 ;
...
      }
}

}

如果線程A先執行writer()方法,接著線程B執行reader()方法,如果發生指令重排,即
public void writer()
{
flag = true;
a = 1;

}

那reader 的業務邏輯整個往下就全錯了.

Tip6:基礎的坑坑

1.run和start的區別:run隻是執行當前線程的默認run方法,如果沒有override的話,啥也不幹,而start才是創建新線程,並調用每個線程默認的run方法呀

2.stop的坑在於終止線程的時候,根本不考慮數據一致性,所以,如果你去民政局改名字改到一半,線程stop了,舍普琴科就叫舍瓦了。。。

3.sleep隻是傻傻的等待,並跑出中斷標記,wait和notify才是可以根據指定的操作對象,進行相互調度,而且wait可以釋放鎖

4.suspend絕對不能用,掛起了也不釋放,如果resume先與其執行,就永遠占用著資源了

5.join的本質是讓調用線程等待在當前線程的對象實例上,所以就是相親相愛一起走

6.yield就是弱逼,先檢測當前是否有相同優先級的線程處於同可運行狀態,如有,則把CPU的占有權交給次線程,否則繼續運行原來的線程,所以yield()方法稱為“退讓”,它把運行機會讓給了同等級的其他線程。

7.volatile做不了計數器,僅僅是讓變量每次在使用的時候,都從主存中取。

8.線程優先級僅僅是大多數情況下好用,無法精準控製

9.synchronized濫用的情況就一個原理,用在了你以為大家都玩這一個,其實各玩兒各的。如new對象上,Integer上

10.線程不安全的容器使用是多線程的大忌,如arrayList,HashMap,原理都是鏈表破壞。。

Tip7:JDK並發包

1.ReentrantLock更加靈活,自定義中斷響應,等待時長

2.公平鎖保證了公平,但付出了管理隊列的代價

下麵什麼信號量,讀寫鎖,線程池,未完待續。。。。。

最後更新:2017-10-23 15:34:11

  上一篇:go  我是如何成為一名驕傲的開發老司機的~!
  下一篇:go  重寫hashcode,玩兒壞HashMap