上案例:
public class thread8monitor
}).start();
new thread(new runnable()
}).start();
/*new thread(new runnable()
}).start();*/ }}
class number catch (interruptedexception e)
system.out.println("one");
} public synchronized void gettwo()
public void getthree()
}
題目:判斷列印的"one" or "two"??
①兩個普通的方法,兩個執行緒,列印? // one two
②新增thread.sleep()給getone(),列印? // one two
③新增普通方法getthree(),列印? //three one two
④兩個普通同步方法,兩個number物件,列印? // two one
⑤修改getone()為靜態方法,乙個number物件,列印? // two one
⑥修改兩個方法均均為靜態方法,乙個number物件? // one two
⑦乙個靜態同步方法,乙個非靜態同步方法,兩個number物件? // two one
⑧兩個靜態同步方法,兩個number物件? //one two
總結:①乙個物件裡面如果有多個synchronized方法,某乙個時刻內,只要乙個執行緒去呼叫其中的乙個synchronized方法了,其他的執行緒都只能等待,換句話說,某一時刻內,只能有唯一乙個執行緒去訪問這些synchronized方法。
②鎖的是當前物件this,被鎖定後,其他執行緒都不能進入到當前物件的其他的synchronized方法。
③加個普通方法後發現和同步鎖無關。
④換成靜態同步方法後,情況又變化
⑤所有的非靜態同步方法用的都是同一把鎖 --例項物件本身,也就是說如果乙個例項物件的非靜態同步方法獲取鎖後,該例項物件的其他非靜態同步方法必須等待獲取鎖的方法釋放鎖後才能獲取鎖,可是別的例項物件的非靜態同步方法因為跟該例項物件的非靜態同步方法用的是不同的鎖,所以毋須等待該例項物件已經取鎖的非靜態同步方法釋放鎖就可以獲取他們自己的鎖。
⑥所有的靜態同步方法用的也是同一把鎖 --類物件本身,這兩把鎖是兩個不同的物件,所以靜態同步方法與非靜態同步方法之間不會有競爭條件。但是一旦乙個靜態同步方法獲取鎖後,其他的靜態同步方法都必須等待該方法釋放鎖後才能獲取鎖,而不管是同乙個例項物件的靜態同步方法之間,還是不同的例項物件的靜態同步方法之間,只要它們是同乙個例項物件
多執行緒基礎學習八 volatile的使用
有一次去某個公司面試,面試官是兩個人,他們問了我乙個問題,是否知道 v le t 關鍵字,以及它的用法,我當時怎麼都想不出來有這個關鍵字,只好說不知道,沒見過這個關鍵字,面試沒通過,臨走的時候我讓他們拼一下這個關鍵字,然後他們告訴我是 volatile 現在想想都覺得是迷之讀音啊。輕量級的同步機制,...
八 Linux下執行緒的互斥
為什麼使用執行緒鎖?在多執行緒應用程式中,當多個執行緒共享相同的記憶體時,如同時訪問乙個變數時,需要確保每個執行緒看到一致的資料檢視,即保證所有執行緒對資料的修改是一致的。如下兩種情況不存在不一致的問題 每個執行緒使用的變數都是其他執行緒不會讀取和修改的 變數是唯讀的 當乙個執行緒在修改變數的值時,...
第八章 執行緒池的使用
二 設定執行緒池的大小 三 配置threadpoolexecutor 執行緒工廠 在呼叫建構函式後再定製threadpoolexecutor 四 擴充套件threadpoolexecutor 五 遞迴演算法的並行化 沒見原理,講的是用法 對執行緒池進行配置和調優 不同的執行緒池的執行策略肯定不一樣 ...