近在讀《深入理解并行編程》,是C的,前面的200頁感覺是通用的思想,前面提到有一個(gè)計(jì)數(shù)器的問題,于是就自己想著用java來實(shí)現(xiàn)下.
中間有遇到問題: 1.假設(shè)只有兩個(gè)線程,一讀一寫,是否需要給這個(gè)資源加鎖? 2.線程狀態(tài)的改變
先上代碼再說吧:
public class Test { PRivate int counts = 0;// 這個(gè)是統(tǒng)計(jì)總數(shù) private int inci_1 = 0;// 這個(gè)是線程1的變量 private int inci_2 = 0;// 這個(gè)是線程2的變量 private int inci_3 = 0;// 這個(gè)是線程3的變量 private boolean a = false, b = false, c = false; /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Test t = new Test(); Inc1 inc1 = t.new Inc1(); Inc2 inc2 = t.new Inc2(); Inc3 inc3 = t.new Inc3(); CountAll c = t.new CountAll(); Thread t1 = new Thread(inc1); Thread t2 = new Thread(inc2); Thread t3 = new Thread(inc3); Thread ct = new Thread(c); t1.start(); t2.start(); t3.start(); ct.start(); } //線程1 class Inc1 implements Runnable { public void run() { for (int i = 0; i < 300000000; i++) { inci_1++; } a = true; } } //線程2 class Inc2 implements Runnable { public void run() { for (int i = 0; i < 300000000; i++) { inci_2++; } b = true; } } //線程3 class Inc3 implements Runnable { public void run() { for (int i = 0; i < 300000000; i++) { inci_3++; } c = true; } } //統(tǒng)計(jì)器 class CountAll implements Runnable { @Override public void run() { // TODO Auto-generated method stub while (!(a && b&&c)) { counts = inci_1 + inci_2 + inci_3; System.out.println(counts); } counts = inci_1 + inci_2 + inci_3; System.out.println("最后的結(jié)果是: "+counts); } }}那么,解決問題的時(shí)刻來了:挖掘機(jī)技術(shù)到底哪家強(qiáng)?????? (扯一下而已,大家不要介意,請(qǐng)自動(dòng)忽略,只是為了顯示LZ是個(gè)DB)
中間的想法是:給每一個(gè)線程分配到一個(gè)空間,線程之間不會(huì)相互影響,只需要通過一個(gè)統(tǒng)計(jì)器來更新所有的工作就好了.關(guān)鍵在于一點(diǎn),沒有了鎖.
《深入理解并行編程》中是這樣描述的:
如果一個(gè)線程去操作一個(gè)加鎖的變量,必須先把這個(gè)變量加載進(jìn)CPU,再修改.這個(gè)時(shí)候若是還有另一個(gè)線程進(jìn)行操作,那線程1需要把東西通過CPU的System Interconnect發(fā)送到線程2,線程1進(jìn)行擦除操作.然后線程2再進(jìn)行修改.也就是說:這個(gè)多線程效率還不如單線程高
那就回來了,我們?yōu)槭裁催€需要去加鎖解鎖?另外,這個(gè)線程間的狀態(tài)的辦法是自己想出來的,因?yàn)楣倦娔X沒鼠標(biāo),不能上網(wǎng)(新員工),只能擼這么多,等拷回家再發(fā).
1.合法的并行線程會(huì)大量增加程序的狀態(tài)空間,導(dǎo)致程序難以理解,降低生產(chǎn)率2.假設(shè)我有10000條東西要弄,有100個(gè)線程,那么我需要給線程每個(gè)分配100的量就好,這樣既兼顧了效率也兼顧了資源3.編寫并行軟件最重要的考慮是如何進(jìn)行分割正確的分割問題能夠讓解決辦法簡(jiǎn)單,可擴(kuò)展并且高性能,而不恰當(dāng)?shù)姆指顔栴}則會(huì)產(chǎn)生緩慢且復(fù)雜的解決方案.
4.在鎖競(jìng)爭(zhēng)必須降低和同步開銷不是主要局限時(shí),可以使用數(shù)據(jù)鎖---數(shù)據(jù)鎖是通過將一塊過大的臨界區(qū)分散到各個(gè)小的臨界區(qū)來減少鎖的競(jìng)爭(zhēng).不過這種擴(kuò)展性的增強(qiáng)帶來的是復(fù)雜性的提高,增加了額外的數(shù)據(jù)結(jié)構(gòu).
記錄下來,以備查驗(yàn)
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注