麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > ASM > 正文

從匯編去分析線程安全

2019-11-14 22:39:05
字體:
來源:轉載
供稿:網(wǎng)友
從匯編去分析線程安全

首先要知道什么是線程安全?

  當多個線程訪問某個類時,不管運行環(huán)境采用何種調度方式或者這些線程將如何交替執(zhí)行,并且在主調代碼中不需要任何額外的同步或協(xié)同,這個類都能表現(xiàn)出正確的行為,那么就稱這個類是線程安全的。

典型線程不安全的列子:

 1 import java.util.*; 4  5 class Worker implements Runnable { 6     PRivate UnsafeCount unsafeCount; 7  8     public Worker(UnsafeCount unsafeCount) { 9         this.unsafeCount = unsafeCount;10     }11 12     @Override13     public void run() {14         // TODO Auto-generated method stub15         for (int i = 0; i < 1000; i++)16             unsafeCount.increase();17     }18 19 }20 21 public class UnsafeCount {22     private int count = 0;23 24     public void increase() {25         count++;26     }27 28     public int getCount() {29         return count;30     }31 32     public static void main(String[] args) throws InterruptedException {33         UnsafeCount uc = new UnsafeCount();34         35         //這里用了list簡陋的方式控制線程的結束,更好的實現(xiàn)是用閉鎖CountDownLatch或者柵欄CyclicBarrier36         List<Thread> list = new ArrayList<Thread>();//37         38         for (int i = 0; i < 10; i++) {39             Thread worker = new Thread(new Worker(uc));40             worker.start();41             list.add(worker);42         }43 44         //阻塞直到線程結束45         for (Thread t : list) {46             t.join();47         }48 49         System.out.println("total is: " + uc.getCount());50 51     }52 }

運行結果(每次結果都不一樣):total is: 7628

我們來仔細分析一下這個結果,開啟10個線程運行,每個線程都對count進行了1000次自增操作,期望的結果應該是1000*10=10000。很明顯運行結果與期望結果不一致。結論是這個類是線程不安全的。為什么會出現(xiàn)這種情況了?

原因是count++這個操作不是原子性,其實這個自增操作是個復合操作:讀-改-寫。 如果我們了解匯編語言的話,對應自增操作的匯編程序可能是:

movl count, %eax  #將count的值讀入eax的寄存器中,inc %eax  #寄存器eax里的值加1,即改寫count值movl %eax, %ebx  #這里ebx寄存器存存放著count的內存地址,這里是值將改寫的count值寫入到內存中

那么這樣就存在一個問題,假如就存在2個線程A和B操作變量count,初始化時刻count為0. 在線程A未寫入改寫值之前,比如在A線程執(zhí)行步驟2的時刻, 線程B開始執(zhí)行,如下所示:

線程A讀入count值為0(步驟1)  -》  改寫count值為1(步驟2)  -》 將改寫后的count值寫入內存中(步驟3) 

                    線程A讀入count值為0 (步驟1)  -》  改寫count值為1(步驟2)  -》 將改寫后的count值寫入內存中(步驟3)

因為線程A還沒有更新改寫count的值到內存,這時線程B讀入count的值仍舊是0,導致最后2個線程結束后count的值為1。由此可見做了2次自增的操作,期望結果是2,但實際結果可能是1.這也是線程不安全的情況下,自增的操作的實際結果往往比期望結果小的原因。

下篇準備將講什么情況是線程不安全的。

  


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 国产精品爱久久久久久久 | a免费视频 | 欧美三级欧美成人高清www | 午夜在线视频观看 | 亚洲欧美一区二区三区在线观看 | 韩国草草影院 | 91中文字幕在线观看 | 99亚洲国产精品 | 欧美韩国日本在线 | 视频www | 精国品产一区二区三区有限公司 | 日本在线视频一区二区三区 | 午夜视频在线看 | 久草在线最新免费 | 今井夏帆av一区二区 | 久久久精品福利 | 沉沦的校花奴性郑依婷c到失禁 | 369看片你懂的小视频在线观看 | 亚洲欧美aⅴ | 欧美成人免费电影 | 亚洲特黄a级毛片在线播放 久久久入口 | 久久精品欧美一区 | 青青国产在线视频 | 一区二区免费 | 视频一区二区精品 | 香蕉视频网站在线观看 | 性 毛片 | 久久国产精品电影 | 成人男女激情免费视频 | 欧美日韩精品中文字幕 | 国产精品麻豆一区二区三区 | 小情侣嗯啊哦视频www | wwwcom国产 | 毛片视频网站在线观看 | 九九综合九九 | 黄色大片在线观看 | 久草在线手机视频 | www.狠狠插.com | 国产精品影视 | 31freehdxxxx欧美 | 成人午夜在线播放 |