国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

Java SE 多線程安全問題產生的原因?

瀏覽:86日期:2023-11-05 17:56:07

問題描述

可能像圖片上的代碼出現負數的概率不大,但在if語句后加上Thread.sleep(10);就能看到輸出負數Java SE 多線程安全問題產生的原因?

問題解答

回答1:

不知道你要問什么,多個線程同時讀取一個資源出現不同步問題很正常,因為可能一個線程獲取值的時候另一個線程恰好在寫值,這就會產生同步問題。

解決辦法有很多,最笨的直接代碼塊上加同步,整個鎖起來;好點的是用線程安全的類,比如AtomInteger這種,保證同步;如果對多線程很有研究,甚至可以只加很少的鎖就能完成任務。

回答2:

線程的調用順序是不保證有序的,其根本原因在于JVM協調資源時線程之間的切換。

回答3:

本質原因是CPU為了提高效率會對指令進行重排序

回答4:

沒有對num進行同步,不能保證當前線程對num的值改之后,其他線程可以立馬看到,題主可以了解下Java內存模型。 以題主的代碼為例,假設執行到最后num=1,三個線程同時執行到if判斷,都能判斷出通過,那就有可能出現負數。

回答5:

1、內存可見性2、修改的原子性

由于num是類靜態變量,那么它會被存到堆中,在run()方法執行時拷貝一份副本到棧中存儲,當有多個線程修改時,可能同時拿到一樣的副本,但是由于執行的前后順序,一個線程修改并寫入了該變量,雖然堆中num已經發生變化,但是其他線程并不知道,它們會繼續修改那份副本。然后修改后寫入堆中,那這樣就會覆蓋之前線程的修改,進而導致狀態的不一致問題。那么如果才能確保線程安全性呢。那就要確保修改num之前保證對堆區修改的可見性,修改之前再拿一份副本(即使之前已經拿過了),這個可用volatile關鍵字來保證。

原子性,由于num--實際執行是兩個操作,那么就會存在執行順序問題。即使在前面說過用volatilel來保證可見性。但是還會存在修改被其他線程覆蓋的情形,只不過幾率變小了。怎樣保證原子性呢,可以采用synchronized關鍵字,Lock機制,以及JDK并發工具包等。對于這種情形,最簡單的辦法就是

private static AtomicInteger num=new AtomicInteger(100);

標簽: java
相關文章:
主站蜘蛛池模板: 国产成人精品福利网站人 | 午夜宅男宅女看在线观看 | 日韩欧美一级毛片视频免费 | 综合91 | 黄在线网站 | 国产成人精品福利站 | 欧美一级xxxx俄罗斯一级 | 精品视频一区二区三区在线观看 | 亚洲第一网站 | 久草中文在线 | 国产一区二区三区在线观看免费 | 国产在线观看一区二区三区 | 二级毛片在线播放 | 草久在线观看视频 | 欧美成人午夜在线全部免费 | 久久精品成人欧美大片免费 | 久久精品一区二区三区不卡牛牛 | 农村寡妇一级毛片免费看视频 | 亚洲视频在线免费看 | 91精品免费久久久久久久久 | 久久久久久一级毛片免费野外 | 免费一级毛片在线播放不收费 | 偷自拍第一页 | 亚洲国产欧美日韩精品一区二区三区 | 久久精品人人爽人人爽快 | 国产乱肥老妇精品视频 | 日本免费观看的视频在线 | 欧美—级v免费大片 | 亚洲欧美一区二区三区在线 | 国产在线播放一区二区 | 亚洲va中文字幕 | 在线视频 国产交换 | 一级二级三级毛片 | 在线视频第一页 | 免费视频观看在线www日本 | 国产激情久久久久影 | 国产午夜免费福利红片 | 成人国产亚洲欧美成人综合网 | 亚洲欧美中文在线观看4 | 九九免费精品视频在这里 | 亚洲欧美日韩在线不卡中文 |