摘要:用線程表示維修的過程維修結束把廁所置為可用狀態維修工把廁所修好了,準備釋放鎖了這個維修計劃的內容就是當維修工進入廁所之后,先把門鎖上,然后開始維修,維修結束之后把的字段設置為,以表示廁所可用。
線程間通信
如果一個線程從頭到尾執行完也不和別的線程打交道的話,那就不會有各種安全性問題了。但是協作越來越成為社會發展的大勢,一個大任務拆成若干個小任務之后,各個小任務之間可能也需要相互協作最終才能執行完整個大任務。所以各個線程在執行過程中可以相互通信,所謂通信就是指相互交換一些數據或者發送一些控制指令,比如一個線程給另一個暫停執行的線程發送一個恢復執行的指令,下邊詳細看都有哪些通信方式。
volatile和synchronized可變共享變量是天然的通信媒介,也就是說一個線程如果想和另一個線程通信的話,可以修改某個在多線程間共享的變量,另一個線程通過讀取這個共享變量來獲取通信的內容。
由于原子性操作、內存可見性和指令重排序的存在,java提供了volatile和synchronized的同步手段來保證通信內容的正確性,假如沒有這些同步手段,一個線程的寫入不能被另一個線程立即觀測到,那這種通信就是不靠譜的~
wait/notify機制故事背景
也不知道是那個遭天殺的給我們學校廁所的坑里塞了個塑料瓶,導致樓道里如黃河泛濫一般,臭味熏天。更加悲催的是整個樓只有這么一個廁所,比這個更悲催的是這個廁所里只有一個坑!!!!!好吧,讓我們用java來描述一下這個廁所:
public class Washroom { private volatile boolean isAvailable = false; //表示廁所是否是可用的狀態 private Object lock = new Object(); //廁所門的鎖 public boolean isAvailable() { return isAvailable; } public void setAvailable(boolean available) { this.isAvailable = available; } public Object getLock() { return lock; } }
isAvailable字段代表廁所是否可用,由于廁所損壞,默認是false的,lock字段代表這個廁所門的鎖。需要注意的是 isAvailable字段被volatile修飾,也就是說有一個線程修改了它的值,它可以立即對別的線程可見~
由于廁所資源寶貴,英明的學校領導立即擬定了一個修復任務:
public class RepairTask implements Runnable { private Washroom washroom; public RepairTask(Washroom washroom) { this.washroom = washroom; } @Override public void run() { synchronized (washroom.getLock()) { System.out.println("維修工 獲取了廁所的鎖"); System.out.println("廁所維修中,維修廁所是一件辛苦活,需要很長時間。。。"); try { Thread.sleep(5000L); //用線程sleep表示維修的過程 } catch (InterruptedException e) { throw new RuntimeException(e); } washroom.setAvailable(true); //維修結束把廁所置為可用狀態 System.out.println("維修工把廁所修好了,準備釋放鎖了"); } } }
這個維修計劃的內容就是當維修工進入廁所之后,先把門鎖上,然后開始維修,維修結束之后把Washroom的isAvailable字段設置為true,以表示廁所可用。
與此同時,一群急得像熱鍋上的螞蟻的家伙在廁所門前打轉轉,他們想做神馬不用我明說了吧
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74173.html
摘要:前文回顧上一篇文章重點嘮叨了中協調線程間通信的機制,它有力的保證了線程間通信的安全性以及便利性。所以同一時刻廚師線程和服務員線程不會同時在等待隊列中。對于在操作系統中線程的阻塞狀態,語言中用和這三個狀態分別表示。 前文回顧 上一篇文章重點嘮叨了java中協調線程間通信的wait/notify機制,它有力的保證了線程間通信的安全性以及便利性。本篇將介紹wait/notify機制的一個應用...
摘要:并發模塊本身有兩種不同的類型進程和線程,兩個基本的執行單元。調用以啟動新線程。在大多數系統中,時間片發生不可預知的和非確定性的,這意味著線程可能隨時暫停或恢復。 大綱 什么是并發編程?進程,線程和時間片交織和競爭條件線程安全 策略1:監禁 策略2:不可變性 策略3:使用線程安全數據類型 策略4:鎖定和同步 如何做安全論證總結 什么是并發編程? 并發并發性:多個計算同時發生。 在現代...
摘要:本文探討并發中的其它問題線程安全可見性活躍性等等。當閉鎖到達結束狀態時,門打開并允許所有線程通過。在從返回時被叫醒時,線程被放入鎖池,與其他線程競爭重新獲得鎖。 本文探討Java并發中的其它問題:線程安全、可見性、活躍性等等。 在行文之前,我想先推薦以下兩份資料,質量很高:極客學院-Java并發編程讀書筆記-《Java并發編程實戰》 線程安全 《Java并發編程實戰》中提到了太多的術語...
摘要:程序執行時,至少會有一個線程在運行,這個運行的線程被稱為主線程。程序的終止是指除守護線程以外的線程全部終止。多線程程序由多個線程組成的程序稱為多線程程序。線程休眠期間可以被中斷,中斷將會拋出異常。 線程 我們在閱讀程序時,表面看來是在跟蹤程序的處理流程,實際上跟蹤的是線程的執行。 單線程程序 在單線程程序中,在某個時間點執行的處理只有一個。 Java 程序執行時,至少會有一個線程在運行...
摘要:運行可運行狀態的線程獲得了時間片,執行程序代碼。阻塞的情況分三種一等待阻塞運行的線程執行方法,會把該線程放入等待隊列中。死亡線程方法執行結束,或者因異常退出了方法,則該線程結束生命周期。死亡的線程不可再次復生。 系列文章傳送門: Java多線程學習(一)Java多線程入門 Java多線程學習(二)synchronized關鍵字(1) java多線程學習(二)synchronized關鍵...
閱讀 1213·2021-11-25 09:43
閱讀 1969·2021-11-11 10:58
閱讀 1187·2021-11-08 13:18
閱讀 2659·2019-08-29 16:25
閱讀 3509·2019-08-29 12:51
閱讀 3307·2019-08-29 12:30
閱讀 748·2019-08-26 13:24
閱讀 3683·2019-08-26 10:38