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 SegmentScopePREVIEW
auto()
ガベージ・コレクタによって自動的に管理される新しいスコープを作成します。static SegmentScopePREVIEW
global()
グローバル・スコープを取得します。boolean
isAccessibleBy
(Thread thread) 指定されたスレッドがこのスコープにアクセスしたり、セグメントをこのスコープに関連付けることができる場合は、true
を返します。boolean
isAlive()
このスコープが有効な場合、true
を返します。void
whileAlive
(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
を使用できます。