<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
多個執行緒可能會共用(存取)同一個資源
比如存取同一個物件,同一個變數,同一個檔案
當多個執行緒存取同一塊資源時,很容易引發資料錯亂和資料安全問題,稱為執行緒安全問題
什麼情況下會出現執行緒安全問題
多個執行緒共用同一個資源
且至少有一個執行緒正在執行寫的操作
分別有存錢和取錢2個執行緒
存錢 取錢
執行緒1 餘額 執行緒2
1000 《----1000------》 1000
1000+1000-----》2000
500 《-----1000-500
正確:結束後餘額應該是1500,而不是500
有賣票2個執行緒
賣票 賣票
執行緒1 票數 執行緒2
1000 《----1000------》 1000
1000-1-----》999
999 《-----1000-1
正確:結束後餘額應該是998,而不是999
買票問題錯誤(未執行緒同步)範例:
public class love implements Runnable{ private int piao=3000;//有3000張票 public boolean sale() {//ture代表還有票;false代表沒有票了 if(piao<1) return false; piao--;//賣1張票 //細化piao--; //暫存器=piao; //暫存器=暫存器-1; //piao=暫存器; String sk =Thread.currentThread().getName();//獲取當前執行緒(買票視窗)的名字 System.out.println(sk+"賣了1張票,還剩下"+piao+"張"); return piao>1; } public void run() { while(sale());//迴圈執行;直至賣完票返回false } } public class Main { public static void main(String[] a) { love tjlove =new love(); for(int i=1;i<=4;i++) {//迴圈4次;產生4個執行緒(視窗)賣票 Thread tj = new Thread(tjlove()); tj.setName(""+i); tj.start(); } } }
部分輸出結果:
執行緒A和B對類中1個變數值為17進行+1操作
最終結果為2個18
加鎖:
過程:首先執行緒A先存取到這個17,讀上來後進行加鎖並進去+1的操作改為18
並且17在加鎖期間其它執行緒都不能存取
改完之後再進行寫入,然後再解鎖17
然後再由執行緒B去存取它,再進行加鎖,重複上面操作變成19再解鎖
這樣做能保證在同一時間只有1個執行緒去存取它,這樣就保證了安全;之前錯誤是由於這些執行緒一起去存取了它
剛剛所說的加鎖操作便是執行緒同步技術
可以使用執行緒同步技術來解決執行緒安全問題
執行緒同步在Java裡有2種做法:
1.同步語句
2.同步方法
public class love implements Runnable{ private int piao=3000;//本人cpu單核效能過強,資料量大些才能看到是4個執行緒在賣票 public boolean sale() { synchronized(this) {//1個執行緒獲取這個物件的鎖,並加鎖; synchronized作用於整個語句 //this指向當前物件 //不能用new Object();這樣會產生新的物件,產生新的鎖 //把this換成"123",效果基本一樣;因為其存在常數值裡,每次存取的物件一樣 if(piao<1) return false; piao--; String sk =Thread.currentThread().getName(); System.out.println(sk+"賣了1張票,還剩下"+piao+"張"); return piao>0; } } public void run() { while(sale()); } }
部分輸出結果:
1.每個物件都有一個與它相關的內部鎖(intrinsic lock)或者叫監視器鎖(monitor lock)
2.第一個執行到同步語句的執行緒可以獲得 obj 的內部鎖,在執行完同步語句中的程式碼後釋放此鎖
3.只要一個執行緒持有了內部鎖,那麼其它執行緒在同一時刻將無法再獲得此鎖
✓ 當它們試圖獲取此鎖時,將會進入BLOCKED狀態
4.多個執行緒存取同一個 synchronized(obj)語句時
obj必須是同一個物件,才能起到同步的作用
public class love implements Runnable{ private int piao=3000; public synchronized boolean sale() { //synchronized作用於整個方法 if(piao<1) return false; piao--; String sk =Thread.currentThread().getName(); System.out.println(sk+"賣了1張票,還剩下"+piao+"張"); return piao>0; } public void run() { while(sale()); } }
synchronized不能修飾構造方法
實體方法:synchronized (this)
靜態方法:synchronized (Class物件)
同步語句比同步方法更靈活一點
同步語句可以精確控制需要加鎖的程式碼範圍,減少處於BLOCKED狀態的執行緒,充分利用勞動力
使用了執行緒同步技術後
雖然解決了執行緒安全問題,但是降低了程式的執行效率
因為加了鎖就會有處於等待的執行緒,多了加鎖解鎖的操作
所以在真正有必要的時候,才使用執行緒同步技術
到此這篇關於Java 詳細講解執行緒安全與同步附範例與註釋的文章就介紹到這了,更多相關Java 執行緒安全內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45