このコードにはいくつか問題があります。
synchronize
プリミティブではできません。
に変更できますが、Integer
以下を参照してください。
非最終オブジェクトで同期することはお勧めできません。
あなたはそれを作ることができましたfinal
オンになっているフィールドを変更するとsynchronized
、いくつかの非常にあいまいな方法で壊れます。そして今、それはfinal
許可されません。
おそらく別のフィールドで同期する方が良いでしょう。
完全を期すために get メソッドも提供する必要があります。
これらの問題をすべて修正すると、コードは次のようになります。
public class Example {
private final Object statusLock = new Object();
private Integer status;
public Example(Integer status) {
this.status = status;
}
public void setStatus(Integer newStatus) {
synchronized (statusLock) {
status = newStatus;
}
}
public Integer getStatus() {
return status;
}
}
さて、このコードで、あなたの質問に対する答えは一種の. ここで起こることは、値を変更している間、他のスレッドからset メソッドを介してフィールドへのすべてのアクセスをロックすることです。status
get メソッドで同期しないことに注意してください。もしそうなら、上記の声明は変わるでしょう。