国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

一個(gè)多線程的計(jì)數(shù)器

2019-11-14 23:54:05
字體:
供稿:網(wǎng)友
一個(gè)多線程的計(jì)數(shù)器

近在讀《深入理解并行編程》,是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)


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 盐城市| 乐东| 汶川县| 汾西县| 巧家县| 平邑县| 沅陵县| 社旗县| 宁武县| 科技| 汕头市| 海原县| 金秀| 华阴市| 龙川县| 澄江县| 仙居县| 介休市| 拉萨市| 瑞金市| 阿拉尔市| 温泉县| 东平县| 雅安市| 沁源县| 来凤县| 贵州省| 萨嘎县| 伊吾县| 大竹县| 宣武区| 霍州市| 安新县| 莱芜市| 敦化市| 东宁县| 库尔勒市| 邳州市| 宿迁市| 广元市| 洛浦县|