java的鎖的機制


 

 

 

---------------------------------------------------------------------------------------------------------------------------------

上面的代碼中,創建一個類實現一個方法,然後在實現Runable接口的兩個線程中同時調用這個方法。可是卻出現了和想的不一樣的地方,

image

本應該是num依次遞增的纔對啊,爲什麼會出現這樣的情況呢,且看我的分析。

分析如下:兩個線程啓動了,第一個t1線程使用類裏面的show()方法,num遞增一,變爲1,然後休眠,t2調用show(),這時num再次遞增1,變爲了二。這時,t1結束休眠繼續執行,打印出第一行,然後t2結束休眠,打印出第二行,這就和上面的運行結果符合了。問題隨之而來,這樣的打印並不正確,因爲是t1先調用的show()方法,t2後調用的show()方法,打印的時候應該是:t1我是第1個調用該方法的線程,t2我是第2個調用該方法的線程纔對啊,呵呵,這纔是這次試驗的目的所在。

對於執行同一段代碼的兩個線而言,這樣運行時很危險的,如果一個線程去寫文件,而另一個線程也去寫文件,寫的順序不一樣,文本寫出來,就會不知道該怎麼去讀寫好的這個文本文件了,所以,必須先讓一個程序去執行完這段代碼之後,另一個線程才能執行,這樣寫的順序纔不會亂,文件纔有意義。既然這樣該怎麼樣去控制呢。java裏面提供了一個鎖的機制,synchronized ,使用這個鎖的機制,可以保證t1執行完這段代碼之後(這其中不管t1是否掛起或者睡眠,執行完成代碼)t2線程才能去執行。synchronized 的使用方法有兩種,一種是

public synchronized void function(){synchronized (this){code;}},public synchronized  void  function(){code;},但是這兩種是有區別的,第二種把synchronized 當作方法的修飾字,實際上是把方法定義成了一個代碼塊,這可能會使持有鎖定的時間比實際長,影響了程序的運行效率。

另外,關於線程的同步還有一個方法,查閱java—jdk文檔可以知道,volatile,這是一個靜態的方法,關於介紹jdk文檔是這麼說的。

image

使用synchronized 雖然能有效避免同步的問題雖然能避免上述的問題的發生,但是會造成死鎖現象,下回分解。

 

發佈了42 篇原創文章 · 獲贊 2 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章