Synchronized FAQ
1534 ワード
1、ロック対象を空にすることはできません
ロックオブジェクトを指定します.インスタンスオブジェクトでなければなりません.newまたは他の方法で作成され、空のオブジェクトではありません.
2、作用域は大きすぎるべきではない
synchronizedが包まれている範囲が大きいと、シリアルで実行されているため、同時プログラミングの目的を達成していないため、プログラムの実行速度に影響します.
3、デッドロックを避ける
public void run() {
synchronized (instance1) {
System.out.println(" :" + Thread.currentThread().getName());
synchronized(instance2){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + " 。");
synchronized (instance2) {
System.out.println(" :" + Thread.currentThread().getName());
synchronized(instance1){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + " 。");
}
}
}
}
4、ロックとsynchronizedキーワードの選択方法
a.よろしければ、できるだけ適用しないでutilを使ってもいいです.concurrentパッケージの様々なクラスは、エラーが発生しにくい.
b.synchronizedが現在のプログラムを適用する場合は、コード量を減らし、エラーを減らすことができるため、優先的に選択します.
c.lockまたはconditionのような構造が必要な場合はlock
abcの3つの核心思想は間違いを避けることだ.