0
0

Java関連概念まとめ集 (Hibernate, Thread, Lock)

Posted at

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

Object Level Locking(オブジェクトレベルロック)とClass Level Locking(クラスレベルロック)は、マルチスレッド環境でデータの一貫性を維持するために使用されるJavaの2つの同期メカニズムです。

オブジェクトレベルロック:

  • 範囲: クラスの特定のインスタンス。
  • メカニズム: 特定のオブジェクトをロックし、そのオブジェクトの同期メソッドやブロックに一度に1つのスレッドのみがアクセスできるようにします。
  • :
    public class MyClass {
        public synchronized void instanceMethod() {
            // 同期インスタンスメソッド
        }
    
        public void someMethod() {
            synchronized(this) {
                // 同期ブロック
            }
        }
    }
    
  • 使用方法: 特定のクラスインスタンスに関連するデータを保護します。

クラスレベルロック:

  • 範囲: クラス全体。
  • メカニズム: クラス自体をロックし、そのクラスの同期静的メソッドやブロックに一度に1つのスレッドのみがアクセスできるようにします。
  • :
    public class MyClass {
        public static synchronized void staticMethod() {
            // 同期静的メソッド
        }
    
        public void someMethod() {
            synchronized(MyClass.class) {
                // 同期ブロック
            }
        }
    }
    
  • 使用方法: クラスのすべてのインスタンスに共有されるデータを保護します。

CallableとRunnableの違い

CallableRunnableは、複数のスレッドによって実行されるタスクを表すために使用されるJavaの2つのインターフェースです。

Callable:

  • 戻り値の型: タイプVの結果を返すことができます。
  • メソッド: 例外をスローできるcall()
  • 使用方法:
    import java.util.concurrent.Callable;
    
    public class MyCallable implements Callable<Integer> {
        @Override
        public Integer call() throws Exception {
            // タスクを実行
            return 123;
        }
    }
    

Runnable:

  • 戻り値の型: Void。
  • メソッド: 例外をスローできないrun()
  • 使用方法:
    public class MyRunnable implements Runnable {
        @Override
        public void run() {
            // タスクを実行
        }
    }
    

HibernateのGetとLoadの違い

GetLoadは、Hibernateでエンティティを取得するために使用されるメソッドです。

Get:

  • ローディング: 即時。
  • 戻り値: エンティティオブジェクトまたはnull。
  • 例外: エンティティが存在しない場合、例外をスローしません。
  • 使用方法: エンティティが存在しない可能性がある場合。
    Session session = sessionFactory.openSession();
    MyEntity entity = session.get(MyEntity.class, 1);
    session.close();
    

Load:

  • ローディング: 遅延(プロキシを返します)。
  • 戻り値: プロキシオブジェクトまたはエンティティオブジェクト。
  • 例外: エンティティが存在しない場合、ObjectNotFoundExceptionをスローします。
  • 使用方法: エンティティが存在すると仮定する場合。
    Session session = sessionFactory.openSession();
    try {
        MyEntity entity = session.load(MyEntity.class, 1);
    } catch (ObjectNotFoundException e) {
        // 例外を処理
    }
    session.close();
    

このドキュメントは、オブジェクトレベルロックとクラスレベルロックの概要、CallableとRunnableの違い、HibernateのGetとLoadメソッドの違いについての包括的な説明を提供します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0