Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaのオブジェクトレベルロックとクラスレベルロック?


両方のオブジェクトレベルのロック およびクラスレベルの場所 kは、同期を実現するために使用されます マルチスレッドアプリケーションのメカニズム。

オブジェクトレベルのロック Javaのすべてのオブジェクトには一意のロックがあります 。スレッドが同期メソッドを実行したい場合 特定のオブジェクトでは、最初にそのオブジェクトのロックを取得する必要があります。スレッドがロックを取得すると、そのオブジェクトに対して同期されたメソッドを実行できるようになります。メソッドの実行が自動的に完了すると、スレッドはロックを解除します。 内部でのロックの取得と解放は、 JVMによって処理されます。 。 オブジェクトレベルのロック 非静的メソッドを同期する場合のメカニズムです。 または非静的コードブロック 1つのスレッドだけがクラスの特定のインスタンスでコードブロックを実行できるようにします。これは、インスタンスレベルのデータをスレッドセーフにするためにいつでも実行できます。

public class ObjectLevelLockTest implements Runnable {
   @Override
   public void run() {
      objectLock();
   }
   public void objectLock() {
      System.out.println(Thread.currentThread().getName());
      synchronized(this) {
         System.out.println("Synchronized block " + Thread.currentThread().getName());
         System.out.println("Synchronized block " + Thread.currentThread().getName() + " end");
      }
   }
   public static void main(String[] args) {
      ObjectLevelLockTest test1 = new ObjectLevelLockTest();
      Thread t1 = new Thread(test1);
      Thread t2 = new Thread(test1);
      ObjectLevelLockTest test2 = new ObjectLevelLockTest();
      Thread t3 = new Thread(test2);
      t1.setName("t1");
      t2.setName("t2");
      t3.setName("t3");
      t1.start();
      t2.start();
      t3.start();
   }
}

出力

t1
t2
t3
Synchronized block t1
Synchronized block t3
Synchronized block t1 end
Synchronized block t3 end
Synchronized block t2
Synchronized block t2 end


クラスレベルのロック

Javaのすべてのクラスには一意のロックがあります これはクラスレベルのロックに他なりません 。スレッドが静的同期メソッドを実行したい場合 、次にスレッドにはクラスレベルのロックが必要です 。スレッドがクラスレベルのロックを取得すると、静的同期メソッドを実行できるようになります そのクラスの。メソッドの実行が自動的に完了すると、スレッドはロックを解放します。 クラスレベルのロック 複数のスレッドが同期ブロックに入るのを防ぎます 実行時に使用可能なすべてのインスタンスのいずれかで。

public class ClassLevelLockTest implements Runnable {
   @Override
   public void run() {
      classLock();
   }
   public void classLock() {
      System.out.println(Thread.currentThread().getName());
      synchronized(ClassLevelLockTest.class) {
         System.out.println("Synchronized block " + Thread.currentThread().getName());
         System.out.println("Synchronized block " + Thread.currentThread().getName() + " end");
      }
   }
   public static void main(String[] args) {
      ClassLevelLockTest test1 = new ClassLevelLockTest();
      Thread t1 = new Thread(test1);
      Thread t2 = new Thread(test1);
      ClassLevelLockTest test2 = new ClassLevelLockTest();
      Thread t3 = new Thread(test2);
      t1.setName("t1");
      t2.setName("t2");
      t3.setName("t3");
      t1.start();
      t2.start();
      t3.start();
   }
}
出力
t3
t2
t1
Synchronized block t3
Synchronized block t3 end
Synchronized block t2
Synchronized block t2 end
Synchronized block t1
Synchronized block t1 end

  1. JavaでのSwingWorkerクラスの重要性は何ですか?

    SwingWorker クラスを使用すると、非同期を実行できます タスク ワーカースレッド(長時間実行タスクなど)で、イベントディスパッチスレッド(EDT )からSwingコンポーネントを更新します。 ) タスクの結果に基づきます。 Java1.6バージョンで導入されました。 SwingWorkerクラス java.swing.SwingWorker クラスはタスクワーカーであり、時間のかかるタスクをバックグラウンドで実行します。 SwingWorker インスタンスは3つのスレッドと相互作用します。現在 スレッド 、ワーカースレッド 、およびイベントディスパッチスレッド(E

  2. JavaでのSwingUtilitiesクラスの重要性は何ですか?

    Javaでは、Swingコンポーネントが画面に表示された後、それらはイベント処理スレッドと呼ばれる1つのスレッドでのみ操作できます。 。別のブロックにコードを記述し、このブロックにイベントへの参照を与えることができます 処理 スレッド 。 SwingUtilities クラスには、 invokeAndWait()という2つの重要な静的メソッドがあります。 およびinvokeLater() コードのブロックへの参照をイベントに配置するために使用します キュー 。 構文 public static void invokeAndWait(Runnable doRun) throws Interr