java多執行緒的乙個小坑 重排序問題

2021-09-19 18:43:22 字數 808 閱讀 3005

先上示例**:

圖1和圖2**本質上的區別是  新執行緒的i=i+1操作下多了println操作。

本質上的流程來說。講status設定為false後應該列印i++多次後的結果。但是由於新執行緒status一開始是儲存在工作記憶體中。

沒有同步主記憶體中的status。因此while迴圈會一直執行。因此圖1是正確的結果。但是圖2加了輸出操作後。發現while迴圈

中斷了。相當於status加了volatile的效果。

以上只是驗證前的猜測,但是如果只是工作記憶體的問題,那在多次執行的情況下,應該是少次出現上述問題,而不是一直出現(工作記憶體會自動同步到主記憶體中,上述問題猜測的話也是在多執行緒情況下會出現的可見性問題)。

後來驗證得知是因為jit(即時編譯器對執行的**做了重排序的問題)

該**while迴圈,即時編譯器做了優化。執行時變成如下**:

由此驗證上述存在的問題。

排序集合的乙個小坑

原來一直用sortlist,sorteddictionary來作為鍵值對儲存的排序集合來用,心中就預設是以key按ascall排序來存放的,在之前的案例中也沒有出現問題,在最近乙個demo中,打破了原來的自以為是的認識,因為在key中不但有大寫小,還有特列符號。先看一下 console.writel...

Linux多執行緒的乙個小例子

include include include include define max count 9 pthread mutex t mutex 互斥變數 pthread cond t cond 條件變數 int count 0 void addcount odd func void void ad...

JAVA多執行緒的乙個簡單案例

只有四個類,前面三個介紹執行緒的休眠喚醒以及結束 最後乙個類是乙個單獨的小例子 建議先看最後的在看前面的 package com.imooc.concurrent.base 隋唐演義大戲舞台 public class stage extends thread catch interruptedexc...