亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果您對一個對象進行了鎖定,那么您是否對它的所有方法都進行了鎖定?

如果您對一個對象進行了鎖定,那么您是否對它的所有方法都進行了鎖定?

www說 2022-06-15 09:48:55
假設我們有一個對象 foo:class Foo(){  public synchronized void instanceMethod(){}}var foo = new Foo();如果我鎖定了 foo:synchronized(foo){  foo.instanceMethod();}我也有instanceMethod()通話鎖定嗎?另一種提問方式 - 如果我鎖定了 foo,另一個線程可以調用 foo.instanceMethod()(同時)嗎?
查看完整描述

2 回答

?
qq_遁去的一_1

TA貢獻1725條經驗 獲得超8個贊

如果我鎖定了 foo,另一個線程可以調用 foo.instanceMethod() 嗎?


他們可以調用它,但調用將等到執行將您的塊synchronized打開foo,因為instanceMethodis synchronized。聲明一個實例方法與將其整個主體放在一個塊中synchronized大致相同。synchronizedthis


如果instanceMethod 沒有同步,那么呼叫當然不會等待。


但是請注意,synchronized您顯示的塊是不必要的:


synchronized(foo){       // <==== Unnecessary

  foo.instanceMethod();

}

因為instanceMethodis synchronized,那只能是:


foo.instanceMethod();

...除非塊中還有其他東西。


查看完整回答
反對 回復 2022-06-15
?
九州編程

TA貢獻1785條經驗 獲得超4個贊

class Foo {

    public synchronized void a() { //Do something }

    public void b() {

        synchronized(this) { // Do something }

    }

    public void c() { // Do something }

}

然后:


Foo foo = new Foo();

foo.a();

foo.b();

synchronized(foo) { foo.c(); }

就同步而言,所有 3 種方法都非常等效。


沒有所謂的“鎖定”方法。鎖定僅對對象進行。標記方法synchronized只是使其鎖定實例(或其靜態方法的類對象)。


當您訪問鎖定對象上的方法時,執行將被阻止,因為線程無法檢索指定對象的監視器- 甚至在調用該方法之前。所以foo.a()在獲取foo.


加上...

我突然想起一件事。如果您有線程 A 調用foo.a()并且它需要很長時間才能完成,并且當時另一個線程調用foo.c(),那么foo.c()仍然會被阻塞直到foo.a()完成。


查看完整回答
反對 回復 2022-06-15
  • 2 回答
  • 0 關注
  • 93 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號