ホームページ  >  記事  >  Java  >  Java スレッドの同期について

Java スレッドの同期について

巴扎黑
巴扎黑オリジナル
2017-04-15 09:06:071856ブラウズ

1、同期方式。

public synchronized void save(){}

2、同期されたコードブロック。

synchronized(object){ 
}

3、揮発性変数を使用します。
volatile を使用してフィールドを変更することは、そのフィールドが他のスレッドによって更新される可能性があることを仮想マシンに伝えることと同じであるため、フィールドが使用されるたびに、レジスタ内の値を使用する代わりに再計算する必要があります。

4、リエントラントロック(ReenreantLock)を使用します

public void save(int money) {
    lock.lock();
    try {
        account += money;
    } finally {
        lock.unlock();
    }
}

5、ThreadLocal変数を使用すると、その変数を使用する各スレッドは変数のコピーを取得します。コピーは互いに独立しているため、各スレッドは次の時点で自分自身を変更できます。 will 他のスレッドに影響を与えない変数のコピー。

6、ブロッキングキューを使用する(LinkedBlockingQueueなど)

7、アトミック変数を使用する(AtomicIntegerなど)

概要:
synchronized:
同期が時々発生する状況では、synchronizedは非常に適しています。その理由は、コンパイラーは通常、可能な限り同期を最適化するためです。同期は JVM レベルで実装されており、一部の監視ツールを通じて同期ロックを監視できるだけでなく、コードの実行中に例外が発生した場合には、JVM が自動的にロックを解放します。

ReentrantLock:
ReentrantLock は、時間制限のある同期、中断可能な同期 (同期は中断できない) など、さまざまな同期を提供します。リソースの競争が激しくない場合、パフォーマンスは同期時よりもわずかに悪くなります。ただし、同期が非常に激しい場合、同期のパフォーマンスが突然数十倍も低下する可能性があります。そして、ReentrantLock は確かに正常性を維持できます。ロックはコードを通じて実装されます。ロックが確実に解放されるようにするには、unlock() をfinally{} に配置する必要があります。

Atomic:
激しくない場合、パフォーマンスは同期よりわずかに劣りますが、激しい場合は正常を維持できます。激しい状況では、Atomic のパフォーマンスは ReentrantLock の約 2 倍になります。


1、同期方式。

public synchronized void save(){}

2、同期されたコードブロック。

synchronized(object){ 
}

3、揮発性変数を使用します。
volatile を使用してフィールドを変更することは、そのフィールドが他のスレッドによって更新される可能性があることを仮想マシンに伝えることと同じであるため、フィールドが使用されるたびに、レジスタ内の値を使用する代わりに再計算する必要があります。

4、リエントラントロック(ReenreantLock)を使用します

public void save(int money) {
    lock.lock();
    try {
        account += money;
    } finally {
        lock.unlock();
    }
}

5、ThreadLocal変数を使用すると、その変数を使用する各スレッドは変数のコピーを取得します。コピーは互いに独立しているため、各スレッドは次の時点で自分自身を変更できます。 will 他のスレッドに影響を与えない変数のコピー。

6、ブロッキングキューを使用する(LinkedBlockingQueueなど)

7、アトミック変数を使用する(AtomicIntegerなど)

概要:
synchronized:
同期が時々発生する状況では、synchronizedは非常に適しています。その理由は、コンパイラーは通常、可能な限り同期を最適化するためです。同期は JVM レベルで実装されており、一部の監視ツールを通じて同期ロックを監視できるだけでなく、コードの実行中に例外が発生した場合には、JVM が自動的にロックを解放します。

ReentrantLock:
ReentrantLock は、時間制限のある同期、中断可能な同期 (同期は中断できない) など、さまざまな同期を提供します。リソースの競争が激しくない場合、パフォーマンスは同期時よりもわずかに悪くなります。ただし、同期が非常に激しい場合、同期のパフォーマンスが突然数十倍も低下する可能性があります。そして、ReentrantLock は確かに正常性を維持できます。ロックはコードを通じて実装されます。ロックが確実に解放されるようにするには、unlock() をfinally{} に配置する必要があります。

Atomic:
激しくない場合、パフォーマンスは同期よりわずかに劣りますが、激しい場合は正常を維持できます。激しい状況では、Atomic のパフォーマンスは ReentrantLock の約 2 倍になります。


以上がJava スレッドの同期についての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。