模块 java.base

接口 SegmentScope


public sealed interface SegmentScope
SegmentScope 是 Java 平台的预览 API。
程序只能在启用预览功能时使用 SegmentScope
预览功能可能会在未来的版本中删除,或升级为 Java 平台的永久功能。
段作用域控制对内存段的访问。

内存段只能在其范围为 时被访问。此外,根据段范围的获取方式,访问权限可能另外为 仅限于特定线程

最简单的段范围是 全球范围 。全局范围始终处于活动状态。因此,与全局范围关联的段始终是可访问的,并且它们的内存支持区域永远不会被释放。此外,与全局范围关联的内存段可以来自任何线程。

 MemorySegment segment = MemorySegment.allocateNative(100, SegmentScope.global());
 ...
 // segment is never deallocated!
 

或者,客户端可以获得一个 自动范围 ,这是一个由垃圾收集器自动管理的段范围。与自动范围关联的内存支持内存段区域在某个未指定的时间被释放 after 它们变成 遥不可及 ,如下所示:

 MemorySegment segment = MemorySegment.allocateNative(100, SegmentScope.auto());
 ...
 segment = null; // the segment region becomes available for deallocation after this point
 
与自动作用域关联的内存段也可以来自任何线程。

最后,客户端可以从现有的 竞技场 中获取段范围PREVIEW 竞技场范围。当 arena 为 关闭 时,与 arena 作用域关联的内存支持内存段区域将被释放PREVIEW .发生这种情况时,arena 作用域变为 not 并且随后对与 arena 作用域关联的段的访问操作将失败 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
参见:
  • 方法总结

    修饰符和类型
    方法
    描述
    auto()
    创建一个由垃圾收集器自动管理的新作用域。
    获取全局范围。
    boolean
    如果提供的线程可以访问和/或将段与此范围关联,则返回 true
    boolean
    返回 true ,如果这个范围是活着的。
    void
    在此作用域保持活动状态时运行关键操作。
  • 方法详情

    • auto

      static SegmentScope PREVIEW  auto()
      创建一个由垃圾收集器自动管理的新作用域。与返回范围关联的段可以由任何线程访问过
      返回:
      由垃圾收集器自动管理的新范围。
    • global

      static SegmentScope PREVIEW  global()
      获取全局范围。与全局范围关联的段可以由任何线程访问过
      返回:
      全球范围。
    • isAlive

      boolean isAlive()
      返回 true ,如果这个范围是活着的。
      返回:
      true ,如果这个范围还活着
    • isAccessibleBy

      boolean isAccessibleBy(Thread  thread)
      如果提供的线程可以访问和/或将段与此范围关联,则返回 true
      参数:
      thread - 要测试的线程。
      返回:
      true 如果提供的线程可以访问和/或将段与该范围关联
    • whileAlive

      void whileAlive(Runnable  action)
      在此作用域保持活动状态时运行关键操作。
      参数:
      action - 要运行的操作。
      抛出:
      IllegalStateException - 如果此范围不是
      WrongThreadException - 如果从线程 T 调用此方法,则 isAccessibleBy(T) == false