1. 問題とリソースの関係
一部の問題では、リソースが多いほど解決が速くなります。注: すべてのプログラムにはシリアル部分が必要であり、合理的な分析により、シリアル部分と並列部分がプログラムに大きな影響を与えることが示されています。シリアル部分の割合とマルチコアの実行効率の間には指数関数的な関係があります。 2.ConcurrentLinkedQueue
マルチコア環境では、このスレッドセーフなキューは、synchronizedListによって生成されるキューよりもはるかに高速です
言えることは、コンカレントで提供されるクラスは、メソッドによって生成されるスレッドセーフなクラスよりも高速であるということです2. スレッドのオーバーヘッド マルチスレッドにはオーバーヘッドがあるため、マルチスレッドの使用はパフォーマンスの向上を保証する必要があります > 同時実行のオーバーヘッド コンテキスト切り替えのオーバーヘッド メモリ同期のオーバーヘッド 3. ロック競合の削減 1. ロック保持者の時間を減らす: ロックの範囲を減らす
private final Map<String, String> attributes = new HashMap<String, String>();//整个方法上锁public synchronized boolean userLocationMatches(String name, String regexp) { String key = "users." + name + ".location"; String location = attributes.get(key);if (location == null)return false;elsereturn Pattern.matches(regexp, location); }public boolean userLocationMatches(String name, String regexp) { String key = "users." + name + ".location"; String location;//只针对可变状态上锁synchronized (this) { location = attributes.get(key); }if (location == null)return false;elsereturn Pattern.matches(regexp, location); }2. ロックリクエストの頻度を減らす: ロック分解、ロック分割... ロック分解: ロックを複数のロックに分解するたとえば、アトミック操作を実行する必要はありません。複数の状態変数を更新する場合、各状態変数は同じクラス ロックを使用します。必要はありません。たとえば、マップ バケットは、独自のロック セグメンテーションを使用できます。このようにして、get などの特定の操作を実行するときに、同時実行効率を向上させるために異なるロックを保持できます。 もちろん、一部の操作では、コンテナーのすべてのセグメントを同時に保持する必要があります。クリアなどのロック
public class ServerStatusBeforeSplit {public final Set<String> users;public final Set<String> queries;public ServerStatusBeforeSplit() { users = new HashSet<String>(); queries = new HashSet<String>(); }//每个方法使用 当前class实例锁,类似于synchronized(this),不管是否是操作同一共享状态public synchronized void addUser(String u) { users.add(u); }public synchronized void addQuery(String q) { queries.add(q); }public synchronized void removeUser(String u) { users.remove(u); }public synchronized void removeQuery(String q) { queries.remove(q); } }public class ServerStatusAfterSplit {public final Set<String> users;public final Set<String> queries;//操作同一 状态的方法 使用相同的锁public ServerStatusAfterSplit() { users = new HashSet<String>(); queries = new HashSet<String>(); }public void addUser(String u) {synchronized (users) { users.add(u); } }public void addQuery(String q) {synchronized (queries) { queries.add(q); } }public void removeUser(String u) {synchronized (users) { users.remove(u); } }public void removeQuery(String q) {synchronized (users) { queries.remove(q); } } }3. ホットスポットを回避します ホットリソース上のロックの競争が激しく、パフォーマンスの問題が発生します 4. 排他的ロックを置き換えます 例:読み取り書き込みロック: 排他性を防ぐための読み取りと読み取りの並列処理、同時実行コンテナーの使用、不変オブジェクトの使用など 5. コンテキストの切り替えを削減します コンテキストスイッチに似ています 例: ログ、ログ印刷、IO 操作により大量のブロックと解放が発生し、パフォーマンスの問題が発生します
以上がJava 同時プログラミング (4) パフォーマンスとスケーラビリティの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。