java.util.concurrent
パッケージには、2つの新しいインタフェースと4つの新しいクラスが含まれています。
CompletableFuture.AsynchronousCompletionTask
: 非同期メソッドによって生成された非同期タスクを識別するマーカー・インタフェースです。
CompletionStage<T>
: CompletionStage
が完了したときにアクションの実行または値の計算を行う、非同期の可能性がある計算のステージです。
CompletableFuture<T>
: 明示的に(その値とステータスを設定して)完了できるFuture
です。その完了時に発生する依存関数およびアクションをサポートし、CompletionStage
として使用できます。
ConcurrentHashMap.KeySetView<K,V>
: キーのSet
としてのConcurrentHashMap
のビューです。オプションで、共通の値にマップすることによって追加を有効化できます。
CountedCompleter<T>
: トリガーされた時点で保留中のアクションが残っていない場合に実行される完了アクションを含むForkJoinTask
です。
CompletionException
: 結果またはタスクを完了する過程でエラーまたはその他の例外が検出されたときにスローされる例外です。
Java 8ではCollections Frameworkの大幅な見直しが行われ、ストリーム機能とラムダ式に基づく集約操作が追加されました。その結果、このリリースではConcurrentHashMap
クラスに30を超える新しいメソッドが導入されました。これには、各種のforEach
メソッド(forEach
、forEachKey
、forEachValue
、forEachEntry
)、検索メソッド(search
、searchKeys
、searchValues
、searchEntries
)、および多数のリダクション・メソッド(reduce
、reduceToDouble
、reduceToLong
など)があります。
その他のメソッド(mappingCount
とnewKeySet
)も追加されました。JDK 8での変更の結果、ConcurrentHashMap
(およびそれらから構築されたクラス)がキャッシュとしてさらに有用になりました。このような変更には、キーが存在しない場合にキーの値を計算するメソッド、エントリのスキャン(および、場合によってはその削除)のサポートの向上、多数の要素を持つマップのサポートの向上などがあります。
完全な詳細については、java.util.concurrent.ConcurrentHashMap
APIの仕様を参照してください。
多数のスレッドによって更新される可能性のある単一のカウント、合計などを維持することは、よく発生するスケーラビリティの問題です。このリリースでは、少数の新しいクラス(DoubleAccumulator
、DoubleAdder
、LongAccumulator
、LongAdder
)を介した、スケーラブルで更新可能な変数のサポートが導入されました。これらのクラスは、Atomic
変数に比べて大幅にスループットを向上させる競合削減技法を内部で利用します。ほとんどのアプリケーションで許容できるような方法で原子性の保証を緩めることにより、これが可能になりました。
DoubleAccumulator
: 指定された関数を使用して更新される処理中のdouble値を一緒に保持する1つ以上の変数。
DoubleAdder
: 初期値ゼロのdoubleの合計を一緒に保持する1つ以上の変数。
LongAccumulator
: 指定された関数を使用して更新される処理中のlong値を一緒に保持する1つ以上の変数。
LongAdder
: 初期値ゼロのlongの合計を一緒に保持する1つ以上の変数。
ほとんどのアプリケーションに適した静的commonPool()
メソッドが利用可能になりました。共通プールは、指定されたプールに明示的に送信されないForkJoinTask
で使用されます。共通プールを使用すると、通常はリソースの使用量が減少します(そのスレッドは未使用時にゆっくりと回収され、その後の使用時に復帰します)。2つの新しいメソッド(getCommonPoolParallelism()
とcommonPool()
)が追加されました。前者は共通プールのターゲット並列性レベルを返し、後者は共通プールのインスタンスを返します。
新しいStampedLock
クラスにより、読取り/書込みアクセスを制御する3つのモード(書込み、読取り、オプティミスティック読取り)を持つ機能ベースのロックが追加されました。このクラスは、条件に応じて3つのモード間の変換を提供するメソッドもサポートしています。
完全な詳細については、java.util.concurrent.StampedLock
APIのドキュメントを参照してください。