public sealed interface SegmentScope
SegmentScopeは、JavaプラットフォームのプレビューAPIです。
プレビュー機能は、今後のリリースで削除するか、Javaプラットフォームの永続機能にアップグレードすることができます。
セグメント・スコープは、メモリー・セグメントへのアクセスを制御します。
自動スコープに関連付けられたメモリー・セグメントは、どのスレッドでも「アクセス済」にすることもできます。
アリーナ・スコープに関連付けられたメモリー・セグメントを
メモリー・セグメントにアクセスできるのは、そのスコープがaliveの場合のみです。 さらに、セグメント・スコープの取得方法によっては、さらに「特定のスレッドに制限されます」にアクセスすることもできます。
最も単純なセグメント・スコープは、「グローバル・スコープ」です。 グローバル・スコープは常に有効です。 その結果、大域スコープに関連付けられたセグメントには常にアクセス可能であり、メモリーのバッキング・リージョンは解放されません。 さらに、グローバル・スコープに関連付けられたメモリー・セグメントは、どのスレッドからでも「アクセス済」にすることができます。
MemorySegment segment = MemorySegment.allocateNative(100, SegmentScope.global());
...
// segment is never deallocated!
または、クライアントは、ガベージ・コレクタによって自動的に管理されるセグメント・スコープである「自動スコープ」を取得できます。 自動スコープに関連付けられたメモリー・バッキング・メモリー・セグメントのリージョンは、次に示すように、unreachableになったあとに未指定の時間に解放されます:
MemorySegment segment = MemorySegment.allocateNative(100, SegmentScope.auto());
...
segment = null; // the segment region becomes available for deallocation after this point
最後に、クライアントは、arenaスコープである既存の「スタジアム」PREVIEWからセグメント・スコープを取得できます。 アリーナ・スコープに関連付けられたメモリー・バッキング・メモリー・セグメントのリージョンは、アリーナがclosedPREVIEWのときに割り当て解除されます。 この場合、アリーナ・スコープはaliveではなくなり、そのアリーナ・スコープに関連付けられたセグメントに対する以降のアクセス操作はIllegalStateExceptionに失敗します。
MemorySegment segment = null;
try (Arena arena = Arena.openConfined()) {
segment = MemorySegment.allocateNative(100, arena.scope());
...
} // segment region deallocated here
segment.get(ValueLayout.JAVA_BYTE, 0); // throws IllegalStateException
accessできるスレッドは、アリーナの種類によって異なります。 たとえば、「競技場」PREVIEWのスコープに関連付けられたセグメントには、そのアリーナを作成したスレッドのみがアクセスできます。 逆に、「共有アリーナ」PREVIEWのスコープに関連付けられたセグメントには、どのスレッドでもアクセスできます。 - 実装要件:
- このインタフェースの実装はスレッド・セーフです。
- 導入されたバージョン:
- 20
- 関連項目:
-
メソッドのサマリー
修飾子と型メソッド説明static SegmentScopePREVIEWauto()ガベージ・コレクタによって自動的に管理される新しいスコープを作成します。static SegmentScopePREVIEWglobal()グローバル・スコープを取得します。booleanisAccessibleBy(Thread thread) 指定されたスレッドがこのスコープにアクセスしたり、セグメントをこのスコープに関連付けることができる場合は、trueを返します。booleanisAlive()このスコープが有効な場合、trueを返します。voidwhileAlive(Runnable action) このスコープが存続している間に、クリティカル・アクションを実行します。
-
メソッドの詳細
-
auto
static SegmentScopePREVIEW auto()ガベージ・コレクタによって自動的に管理される新しいスコープを作成します。 返されるスコープに関連付けられたセグメントは、どのスレッドでも「アクセス済」にできます。- 戻り値:
- ガベージ・コレクタによって自動的に管理される新しいスコープ。
-
グローバル
static SegmentScopePREVIEW global()グローバル・スコープを取得します。 グローバル・スコープに関連付けられたセグメントは、どのスレッドでも「アクセス済」にできます。- 戻り値:
- グローバル・スコープ。
-
isAlive
boolean isAlive()このスコープが有効な場合、trueを返します。- 戻り値:
true。このスコープが有効な場合
-
isAccessibleBy
boolean isAccessibleBy(Thread thread) 指定されたスレッドがこのスコープにアクセスしたり、セグメントをこのスコープに関連付けることができる場合は、trueを返します。- パラメータ:
thread- テストするスレッド。- 戻り値:
- 指定されたスレッドがこのスコープにアクセスしてセグメントを関連付けることができる場合、
true
-
whileAlive
void whileAlive(Runnable action) このスコープが存続している間に、クリティカル・アクションを実行します。- パラメータ:
action- 実行するアクション。- 例外:
IllegalStateException- このスコープがaliveでない場合。WrongThreadException- このメソッドがスレッドTから呼び出された場合(isAccessibleBy(T) == falseなど)。
-
SegmentScopeを使用できます。