public sealed interface SegmentScope
SegmentScope 是 Java 平台的预览 API。
预览功能可能会在未来的版本中删除,或升级为 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
- 参见:
-
方法总结
修饰符和类型方法描述static SegmentScopePREVIEWauto()创建一个由垃圾收集器自动管理的新作用域。static SegmentScopePREVIEWglobal()获取全局范围。booleanisAccessibleBy(Thread thread) 如果提供的线程可以访问和/或将段与此范围关联,则返回true。booleanisAlive()返回true,如果这个范围是活着的。voidwhileAlive(Runnable action) 在此作用域保持活动状态时运行关键操作。
-
方法详情
-
auto
创建一个由垃圾收集器自动管理的新作用域。与返回范围关联的段可以由任何线程访问过。- 返回:
- 由垃圾收集器自动管理的新范围。
-
global
获取全局范围。与全局范围关联的段可以由任何线程访问过。- 返回:
- 全球范围。
-
isAlive
boolean isAlive()返回true,如果这个范围是活着的。- 返回:
true,如果这个范围还活着
-
isAccessibleBy
如果提供的线程可以访问和/或将段与此范围关联,则返回true。- 参数:
thread- 要测试的线程。- 返回:
true如果提供的线程可以访问和/或将段与该范围关联
-
whileAlive
在此作用域保持活动状态时运行关键操作。- 参数:
action- 要运行的操作。- 抛出:
IllegalStateException- 如果此范围不是 活。WrongThreadException- 如果从线程T调用此方法,则isAccessibleBy(T) == false。
-
SegmentScope。