変更された場合は、Javaのブロックを同期しますか?

ealeon:
private Object x = new Object();

public void doA() {
   synchronized(x){
       x = new Object();
       //do something
    }
}

public void doB() {
    synchronized(x) {
        //do something 
    }
}

言うことができますdoA()し、doB()同時に呼ばれていましたが、doA()最初に進行しています。Bをするまでブロックされますので、doA()完成されました

これは、場合も同様ですdoA()修正は中のX x = new xコール?または、この行の後x = new xdoA() doB()はもはやので、ブロックされませんx変わりましたか?

Kröw:

何が起こるかというと、実際にどのように迅速に依存するdoA()実行されます:

場合doA()の値に変更xする前にdoB()到達し、その同期ブロックを、その後doB()にロックする新しいことをオブジェクトdoA()作成。

場合はdoB()迅速で、synchronized(x)前の部分が評価されますdoA()の値を変更することができx、その後doB()になるまで待たなければならないdoA()synchronizedブロックが終了します。

説明

Javaはになるたびにsynchronized(x)、いずれかの方法でコードは、変数を評価xし、その変数には、Javaにオブジェクトを提供します。Javaのように、そのオブジェクトにロックされ、そのオブジェクトのロック、滞在しようとします。それとも、そのオブジェクトのロックがすでにありますならば、それは離れて行くためにロックを待機します。(Javaが到達するたびにsynchronized(x)コードを使用すると、後で喜ばとして変数を変更することができますが、ロックとロックがまだチェックし、変数の前の値に起こるので、それは、変数自体変数と無視忘れの値をとります。)

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=200597&siteId=1