モジュール java.base
パッケージ java.lang.foreign

インタフェースSegmentScope


public sealed interface SegmentScope
SegmentScopeは、JavaプラットフォームのプレビューAPIです。
プレビュー機能が有効な場合のみ、プログラムでSegmentScopeを使用できます。
プレビュー機能は、今後のリリースで削除するか、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
関連項目:
  • メソッドのサマリー

    修飾子と型
    メソッド
    説明
    ガベージ・コレクタによって自動的に管理される新しいスコープを作成します。
    グローバル・スコープを取得します。
    boolean
    指定されたスレッドがこのスコープにアクセスしたり、セグメントをこのスコープに関連付けることができる場合は、trueを返します。
    boolean
    このスコープが有効な場合、trueを返します。
    void
    このスコープが存続している間に、クリティカル・アクションを実行します。
  • メソッドの詳細

    • 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など)。