天天看點

初涉java多線程(一)

十一期間看了一點java多線程,現在又回顧了一下。看書-->論壇-->看書 算是一個很好的學習步驟。把了解的DD寫下來就了解的更實在了。

代碼運作後,根本看不到0000000007輸出在控制值或指令行;而是001與002交替輸出:synchronized 并不是鎖住代碼塊or方法,否則隻有一個一直輸出。

t與tt是不同的對象,他們之間沒有什麼線程安全問題。

t1.start(); 由于調用了printInfo()同步方法,t對象關聯的鎖被線程一所得,無限循環的輸出(運作)導緻的結果是,線程一在程式運作期間不會釋放t對象的鎖;是以27行啟動線程三後會一直阻塞于39行,因為線程一、三通路的是同一對象,線程一不釋放鎖,39行中線程三觊觎這把鎖,隻能阻塞了。

有人會問35行怎麼能執行?這裡隻是把對象引用指向堆中對象,并沒有通路對象(給對象傳消息),是以35行能執行。(傳遞的是對象引用的拷貝)

倘若把第7行的synchronized去掉,那麼就能看到0000000007輸出在控制值或指令行;此時線程三并未順利執行,線程三隻是執行了39行,阻塞于40行;因為setInfo不是同步方法了,調用此方法時,線程不需要得到對象的關聯鎖;而40行調用printInfo()同步方法時,隻能阻塞了:線程一還沒有釋放此對象的鎖...

第7、10行的兩個同步方法可寫成下面的形式:

synchronized(this)是不是很形象了:對象要調用本方法,就鎖住此對象。