class A{
public synchronized void doSomething1{
}
public synchronized void doSomething2{
}
public synchronized static void doSomething3{
}
}
若一個類中同時包含一些靜態同步方法和非靜態同步方法。new一個該類的物件,開ab兩個執行緒,若a執行緒執行非靜態同步方法時,b執行緒無法訪問該物件的其他非靜態同步方法,這點是確定的。
我想問的是若a執行緒執行非靜態同步方法時,b執行緒能執行靜態同步方法嗎?以及若a執行緒執行靜態同步方法時,b執行緒能執行非靜態同步方法嗎?
uj5u.com熱心網友回復:
靜態與非靜態是兩個鎖,同時執行靜態或非靜態才會互斥。uj5u.com熱心網友回復:
靜態方法必須要在靜態類中,你能這樣寫嗎uj5u.com熱心網友回復:
靜態方法可以在非靜態類中的啊
uj5u.com熱心網友回復:
是不是說非靜態鎖是屬于物件的,而靜態鎖是屬于class類的,同一物件下不同鎖不影響,但不同物件都受靜態鎖影響?
uj5u.com熱心網友回復:
鎖只對自己的作用范圍有影響。實體和靜態不在一個作用范圍內,說不上有影響。
uj5u.com熱心網友回復:
非靜態方式是鎖this物件本身,靜態方法是鎖this.getClass()的類物件,這是兩把不同鎖也就是a拿this鎖,不影響b拿this.getClass()鎖,反過來也一樣,a拿this.getClass()鎖,不影響b拿this鎖
除非
a不光拿了this鎖,還貪婪的拿了this.getClass()鎖,那b就只能喝西北風了
uj5u.com熱心網友回復:
呼叫方式可以發出來嗎,我這邊寫了個呼叫發現和你描述的不一樣啊uj5u.com熱心網友回復:
靜態與非靜態不是同一把鎖,你的呼叫方式不互斥,是可以的。uj5u.com熱心網友回復:
靜態方法上加 synchronized,你可以認為是 synchronized(類名.class)非靜態方法上加 synchronized,你可以認為是 synchronized(this)
靜態方法加鎖,只有一把鎖
非靜態方法加鎖,有多少個物件就有多少把鎖
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/17765.html
標籤:Java SE
