物件鎖和類鎖的區別

2021-10-23 06:25:09 字數 2973 閱讀 8828

物件鎖,顧名思義是鎖住物件,不同例項的鎖互不影響。

物件鎖有兩種加鎖的方式,主要卻在於synchronized作用的地方的不同

1.作用在例項方法上

public synchronized void method(){}
2.作用在**塊上

public void method()

}

持有相同物件鎖的地方會出現互斥:

public synchronized  void method1() catch (interruptedexception e) }}

public synchronized void method2() catch (interruptedexception e) }}

public static void main(string args)

}).start();

new thread(new runnable()

}).start();

}

執行結果:

thread-0持有了物件鎖

thread-0持有了物件鎖

thread-0持有了物件鎖

thread-0持有了物件鎖

thread-0持有了物件鎖

thread-0持有了物件鎖

thread-0持有了物件鎖

這裡的執行結果實際上陷入了死迴圈。因為我設定了while(ture),可以看到,thread-0持有了當前物件的鎖之後,就會排斥持有相同物件鎖的執行緒。

synchronized修飾在例項方法上,代表著這裡鎖的是當前物件this.

那麼對於不同的物件,將不會產生相互影響:

public static void main(string args) 

}).start();

new thread(new runnable()

}).start();

}

執行結果:

thread-0持有了物件鎖

thread-1持有了物件鎖

thread-0持有了物件鎖

thread-1持有了物件鎖

thread-0持有了物件鎖

thread-1持有了物件鎖

可以看到持有不同物件鎖的執行緒互不影響。

synchronized(object){}的效果和在例項方法上加鎖一樣,不同的是可以在()裡新增不同的物件,例如:

synchronized(object1){}

synchronized(object2){}

當括號裡的物件是一樣時,表示持有的是同一物件鎖,反之,就不是同一物件鎖,那麼執行緒呼叫時互不干擾。

synchronized(object){}()中的物件與例項方法上鎖的是同一物件,那麼將會互斥。例如:

public synchronized void method(){}

public void method()

這裡,都代表鎖的是當前類的物件,所持有的鎖是同一把。

不管多少物件都共用同一把鎖,同步執行,乙個執行緒執行結束、其他的才能夠呼叫同步的部分

也是有兩種不同的加鎖方式。不同的類鎖互不影響

1.用synchronized修飾靜態方法

public synchronized static void method()
2.作用在**塊上

public void method()

}

當持有類鎖時,所有例項呼叫這個方法上都會互相排斥。

public synchronized static void staticmethod1() catch (interruptedexception e) }}

public synchronized static void staticmethod2() catch (interruptedexception e) }}

public static void main(string args)

}).start();

new thread(new runnable()

}).start();

}

執行結果:

thread-0持有了類鎖

thread-0持有了類鎖

thread-0持有了類鎖

thread-0持有了類鎖

thread-0持有了類鎖

thread-0持有了類鎖

可以看到,雖說呼叫的是不同物件的同步方法,但還是產生了互斥。

物件鎖和類鎖會互斥嗎?

//物件鎖

public synchronized void method1() catch (interruptedexception e) }}

//類鎖

public synchronized static void staticmethod1() catch (interruptedexception e)

}}

new thread(new runnable() 

}).start();

new thread(new runnable()

}).start();

}

執行結果:

thread-0持有了物件鎖

thread-1持有了類鎖

thread-0持有了物件鎖

thread-1持有了類鎖

thread-0持有了物件鎖

thread-1持有了類鎖

可以看到物件鎖和類鎖互不影響。

類鎖和物件鎖

物件鎖 當乙個物件中有synchronized method或synchronized block的時候呼叫此物件的同步方法或進入其同步區域時,就必須先獲得物件鎖。如果此物件的物件鎖已被其他呼叫者占用,則需要等待此鎖被釋放 同步靜態方法 靜態變數互斥體 由於乙個class不論被例項化多少次,其中的靜...

類鎖和物件鎖

類鎖 和 物件鎖 1.類鎖 先定義這麼乙個類 classt synchronized static methoda 那麼 例項化兩個物件之後 classt a classt b 在這兩個物件呼叫methoda時,第乙個呼叫的會得到classt類的類鎖,第二個呼叫的要等到第乙個呼叫結束後釋放鎖,才能完...

類鎖和物件鎖的詳解

最近在面試中遇到很多關於多執行緒的問題,特別是鎖的應用,現在我就來說說類鎖和物件鎖。物件鎖 synchronized method 和類鎖 static sychronized method 的區別 物件鎖也叫例項鎖,對應synchronized關鍵字,當多個執行緒訪問多個例項時,它們互不干擾,每個...