Synchronized FAQ


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つの核心思想は間違いを避けることだ.

5、面接の7つの質問は、前のブログを参照してください。