乙個物件裡面如果有多個synchronized方法,某乙個時刻內,只要乙個執行緒去呼叫其中的乙個synchronized方法了,其它的執行緒都只能等待,換句話說,某乙個時刻內,只能有唯一乙個執行緒去訪問這些synchronized方法鎖的是當前物件this,被鎖定後,其它的執行緒都不能進入到當前物件的其它的synchronized方法
加個普通方法後發現和同步鎖無關
換成兩個物件後,不是同一把鎖了,情況立刻變化。
都換成靜態同步方法後,情況又變化
所有的非靜態同步方法用的都是同一把鎖——例項物件本身,也就是說如果乙個例項物件的非靜態同步方法獲取鎖後,該例項物件的其他非靜態同步方法必須等待獲取鎖的方法釋放鎖後才能獲取鎖,可是別的例項物件的非靜態同步方法因為跟該例項物件的非靜態同步方法用的是不同的鎖,所以毋須等待該例項物件已獲取鎖的非靜態同步方法釋放鎖就可以獲取他們自己的鎖。
所有的靜態同步方法用的也是同一把鎖——類物件本身,這兩把鎖是兩個不同的物件,所以靜態同步方法與非靜態同步方法之間是不會有競態條件的。但是一旦乙個靜態同步方法獲取鎖後,其他的靜態同步方法都必須等待該方法釋放鎖後才能獲取鎖,而不管是同乙個例項物件的靜態同步方法之間,還是不同的例項物件的靜態同步方法之間,只要它們同乙個類的例項物件!
packagecom.company;
/** 題目:判斷列印的 "one" or "two" ?
* * 1. 兩個普通同步方法,兩個執行緒,標準列印, 列印? //one two
* 2. 新增 thread.sleep() 給 getone() ,列印? //one two
* 3. 新增普通方法 getthree() , 列印? //three one two
* 4. 兩個普通同步方法,兩個 number 物件,列印? //two one
* 5. 修改 getone() 為靜態同步方法,列印? //two one
* 6. 修改兩個方法均為靜態同步方法,乙個 number 物件? //one two
* 7. 乙個靜態同步方法,乙個非靜態同步方法,兩個 number 物件? //two one
* 8. 兩個靜態同步方法,兩個 number 物件? //one two
* * 執行緒八鎖的關鍵:
* ①非靜態方法的鎖預設為 this, 靜態方法的鎖為 對應的 class 例項
* ②某乙個時刻內,只能有乙個執行緒持有鎖,無論幾個方法。 */
public
class
testthread8monitor ).start();
//new thread(() -> number.getthree()).start();}}
class
number
catch
(interruptedexception e)
system.out.println("one");
}synchronized
void gettwo()
public
void
getthree()
}
Java多執行緒 鎖物件
前面總結了多個執行緒訪問同乙個物件的同步方法以同步執行,多個執行緒訪問多個物件的同步方法則以非同步方式執行,那如果多個執行緒分別訪問乙個物件中同步方法和非同步方法會如何執行那?demo myobject類 包含了乙個同步方法和乙個非同步方法 public class myobject catch i...
java 多執行緒 synchronized鎖重入
public class service synchronized public void service2 synchronized public void service3 新建乙個服務類 在這裡,沒乙個方法都是加上了鎖的,可重入鎖 的概念是,自己可以再次獲取自己的內部鎖。比如有1條執行緒獲得了...
Java多執行緒 樂觀鎖 悲觀鎖
悲觀鎖 pessimistic lock 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。樂觀鎖 optim...