obj
オブジェクトにブロックの数がある場合、Javaはこれらのすべてが同じかどうかを確認しますか?彼らは他のをブロックします上記の機能f
、2つのスレッドによって同時に呼び出された場合Javaロック:同期ブロックで監視ロックの等価性チェックがどのように行われますか?
public static f() {
synchronized ("xyz") {
...
}
}
:たとえば
?各スレッドはString
オブジェクトの新しいインスタンスを取得することに注意してください。
これを確認するには、次のテストコードを書きました。実際には、上記のブロックは機能すると思われますが、予期しない結果が出るようです。
public class Test {
public static void main(String[] args){
new Thread() {
public void run() {
//f1("A", new X());
f1("A", "Str");
}
}.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//f1("B", new X());
f1("B", "Str");
}
public static void f1(String a, Object x) {
synchronized(x) {
System.out.println("f1: " + a);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("f1: " + a + " DONE");
}
}
private static class X {
public boolean equals(Object o) {
System.out.println("equals called");
return true;
}
public int hashCode() {
System.out.println("hashCode called");
return 0;
}
}
}
あなたは上記のコードを実行する場合は、次のような出力を取得します: - 私はf1("A", "Str");
とf1("B", "Str");
行をコメントし、その上の行のコメントを解除場合
f1: A
f1: A DONE
f1: B
f1: B DONE
をしかし、その後、結果があります: - Str
バージョンは、私は多分Javaがequals
CHEを使用していることを期待していたので、働いていたので
f1: A
f1: B
f1: A DONE
f1: B DONE
ブロック、おそらくhashCode
の場合はckですが、2番目のテストではそうではありません。
String
は特殊なケースですか?