JavaRush /Java Blog /Random-JA /スレッド同期、オブジェクトロック、クラスロック
CynepHy6
レベル 34
Великий Новгород

スレッド同期、オブジェクトロック、クラスロック

Random-JA グループに公開済み
スレッド同期、オブジェクト ロック、クラス ロック - 1同期とはマルチスレッドを指します。同期されたコード ブロックは、一度に 1 つのスレッドによってのみ実行できます。 Java では、複数のスレッドの実行がサポートされています。これにより、2 つ以上のスレッドが同じフィールドまたはオブジェクトにアクセスする可能性があります。同期は、プログラム内のすべての並列スレッドが同期的に実行できるようにするプロセスです。同期により、共有メモリへの一貫性のないアクセスによって引き起こされるメモリ整合性エラーが回避されます。メソッドが同期済みとして宣言されると、スレッドはメソッドが実行されているオブジェクトのモニターを保持します。別のスレッドが同期メソッドを実行している場合、そのスレッドは、他のスレッドがモニターを解放するまでブロックされます。Java では予約語を使用して同期が行われますsynchronized同期されたメソッドまたはブロックを定義することで、クラス内で使用できます。synchronizedクラス定義の変数または属性で使用することはできません。

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

これは、非静的メソッドまたはコードの非静的ブロックを同期して、クラスの特定のインスタンス上で特定のブロックまたはメソッドを 1 つのスレッドだけが実行できるようにするためのメカニズムです。これは、インスタンスレベルのデータをスレッドセーフにする必要がある場合は常に実行する必要があります。例:
public class DemoClass{
    public synchronized void demoMethod(){}
}
または
public class DemoClass{
    public void demoMethod(){
        synchronized (this)        {
            //other thread safe code
        }
    }
}
または
public class DemoClass{
    private final Object lock = new Object();
    public void demoMethod(){
        synchronized (lock)        {
            //other thread safe code
        }
    }
}

クラスレベルのロック

クラスの使用可能なインスタンスのいずれかでの実行中に、複数のスレッドが同期ブロックに入るのを防ぎます。これは、プログラムの実行中にクラスのインスタンスが 100 個ある場合DemoClass、その時点でいずれかのケースで実行できるのは 1 つのスレッドだけdemoMethod()であり、他のすべてのケースは他のスレッドに対してブロックされることを意味します。これは、静的データをスレッドセーフにする必要がある場合に必要です。
public class DemoClass{
    public synchronized static void demoMethod(){}
}
または
public class DemoClass{
    public void demoMethod(){
        synchronized (DemoClass.class)        {
            //other thread safe code
        }
    }
}
または
public class DemoClass
{
    private final static Object lock = new Object();
    public void demoMethod(){
        synchronized (lock)        {
            //other thread safe code
        }
    }
}

重要な注意事項

  1. Java の同期により、2 つのスレッドが同期されたメソッドを同時にまたは並行して実行できないことが保証されます。

  2. synchronizedメソッドとコード ブロックでのみ使用できます。これらのメソッドまたはブロックは、静的または非静的にすることができます。

  3. スレッドが同期メソッドまたはブロックに入るたびにロックを取得し、スレッドが同期メソッドまたはブロックを終了するたびに、JVM はロックを解放します。エラーや例外が原因で完了後にスレッドが同期メソッドを離れた場合でも、ロックは解放されます。

  4. synchronizedJava ではこれは、同期メソッドが同じロックを必要とする別の同期メソッドを呼び出した場合、ロックを保持している現在のスレッドはロックを取得せずにそのメソッドに入ることができることを意味します。

  5. Синхронизация в Java будет бросать NullPointerException если an object используемый в синхронизированном блоке null. Например, в вышеприведенном примере codeа, если замок инициализируется How null, синхронизированный (lock) бросит NullPointerException.

  6. Синхронизированные методы в Java вносят дополнительные затраты на производительность вашего applications. Так что используйте синхронизацию, когда она абсолютно необходима. Кроме того, рассмотрите вопрос об использовании синхронизированных блоков codeа для синхронизации только критических секций codeа.

  7. Вполне возможно, что и статический и не статический синхронизированные методы могут работать одновременно or параллельно, потому что они захватывают замок на другой an object.

  8. В соответствии со спецификацией языка вы не можете использовать synchronized в конструкторе это приведет к ошибке компиляции.

  9. Не синхронизируйте по не финальному (no final) полю, потому что link, на не финальное поле может измениться в любое время, а затем другой поток может получить синхронизацию на разных an objectх и уже не будет ниHowой синхронизации вообще. Лучше всего использовать класс String, который уже неизменяемый и финальный.

Удачи в обучении!! Оригинал: Object level lock vs Class level lock in Java
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION