问题标签 [jsr166]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2385 浏览

java - 为什么我不能在 SecurityManager 下关闭我自己的 ExecutorService?

在默认的安全管理器下,如果我创建一个ExecutorService(在这种情况下是ThreadPoolExecutor),我无法关闭它,shutdown()只是调用checkPermission("modifyThread")并因此立即死亡:

孙 JDK:

$ java -Djava.security.manager 当前线程:线程“main”中的 Thread[main,5,main] 异常 java.security.AccessControlException:java.security.AccessControlContext.checkPermission 的访问被拒绝(java.lang.RuntimePermission modifyThread) (AccessControlContext.java:323) 在 java.security.AccessController.checkPermission(AccessController.java:546) 在 java.lang.SecurityManager.checkPermission(SecurityManager.java:532) 在 java.util.concurrent.ThreadPoolExecutor.shutdown(ThreadPoolExecutor. java:1094) 在 A.main(A.java:22)

OpenJDK:

$ java -Djava.security.manager 当前线程:线程“main”中的 Thread[main,5,main] 异常 java.security.AccessControlException:java.security.AccessControlContext.checkPermission 的访问被拒绝(java.lang.RuntimePermission modifyThread) (AccessControlContext.java:342) 在 java.security.AccessController.checkPermission(AccessController.java:553) 在 java.lang.SecurityManager.checkPermission(SecurityManager.java:549) 在 java.util.concurrent.ThreadPoolExecutor.checkShutdownAccess(ThreadPoolExecutor. java:711) 在 java.util.concurrent.ThreadPoolExecutor.shutdown(ThreadPoolExecutor.java:1351) 在 A.main(A.java:22)

为什么???????创建一个只有你控制的线程池并关闭它有什么安全隐患?这是实现中的错误,还是我遗漏了什么?

让我们看看ExecutorService.shutdown的规范是怎么说的……

启动有序关闭,其中执行先前提交的任务,但不会接受新任务。如果已经关闭,调用没有额外的效果。

抛出:SecurityException - 如果安全管理器存在并且关闭此 ExecutorService 可能会操作不允许调用者修改的线程,因为它不持有 RuntimePermission("modifyThread"),或者安全管理器的 checkAccess 方法拒绝访问。

这……是最模糊的。该规范没有说明在 ExecutorService 的生命周期中创建的任何“系统线程”,此外,它允许您提供自己的线程,这证明当您这样做时不应该涉及“系统线程”。(如上所述在我的示例源中完成)

感觉就像 Java SE 实现者看到了shutdownraise是可能的SecurityException,所以他们就像,“哦,好吧,我将在这里添加一个随机安全检查以确保合规性”......

问题是,阅读 OpenJDK 源代码(openjdk-6-src-b20-21_jun_2010),事实证明,创建任何线程的唯一方法是调用您提供的ThreadFactory(在我的测试用例中从未调用过,因为我没有'不创建任何工作,我不调用prestartCoreThreadpreStartAllCoreThreads)。因此,在 OpenJDK 的 ThreadPoolExecutor 中没有明显的原因进行安全检查(就像在 sun-jdk-1.6 中所做的那样,但我没有源代码):

checkShutdownAccess在做任何事情之前被调用...

如您所见,它无条件地调用checkPermission(shutdownPerm)安全管理器.... shutdownPerm 定义为... private static final RuntimePermission shutdownPerm = new RuntimePermission("modifyThread");

...据我所知,这绝对没有意义,因为这modifyThread意味着访问系统线程,并且这里没有系统线程在起作用,事实上,根本没有线程,因为我没有提交任何工作或预启动,即使有线程,它们也会是我的线程,因为我传入了ThreadFactory. 规范没有说任何关于神奇死亡的内容,除了如果涉及系统线程(它们不是),可能会有一个SecurityException.

基本上,为什么我不能删除检查系统线程访问的行?我认为没有安全隐患需要它。还有其他人怎么没有遇到过这个问题???我在问题跟踪器上看到了一篇帖子,他们通过将调用更改为 来“解决”了这个问题shutdownNowshutdown显然,这并没有为他们解决这个问题。

0 投票
2 回答
1436 浏览

java - Fork-join 中的内存可见性

Brian Goetz 在http://www.ibm.com/developerworks/java/library/j-jtp03048.html上写了一篇关于 fork-join 的好文章。在其中,他列出了一种使用 fork-join 机制的合并排序算法,其中他在数组的两侧并行执行排序,然后合并结果。

该算法同时对同一数组的两个不同部分进行排序。为什么不是 AtomicIntegerArray 或其他保持可见性所必需的机制?有什么保证一个线程会看到另一个线程完成的写入,或者这是一个微妙的错误?作为后续,Scala 的 ForkJoinScheduler 是否也做出了这种保证?

谢谢!

0 投票
2 回答
272 浏览

java - 交换器似乎不交换()

我有一个非常简单的问题,我尝试在两个任务之间交换一个对象(在这种情况下是一个 int 数组):生产者和消费者。Producer 类生成一个 int 数组,然后尝试使用 Exchanger 对象与 Consumer 数组(这是一个空数组)交换它。但它似乎不起作用:当消费者试图打印数组时,它什么也得不到。

如果我取消注释 Producer 中的行,我会看到生成的数字仍然存在。那么为什么它不交换对象呢?

0 投票
4 回答
19624 浏览

java - BlockingQueue 和 TransferQueue 的区别

对于 BlockingQueue/LinkedBlockingQueue 与 jsr166y 和 java 7 中的新 TransferQueue/LinkedTransferQueue 类型之间的区别,我有点困惑

0 投票
3 回答
4039 浏览

java - AtomicReferenceFieldUpdater - 方法 set、get、compareAndSet 语义

来自 JavaAtomicReferenceFieldUpdater文档

请注意,compareAndSet此类中方法的保证比其他原子类中的要弱。因为这个类不能确保该字段的所有使用都适合原子访问的目的,所以它只能保证对 and 的其他调用的原子性和易失性compareAndSet语义set

这意味着我不能与 一起进行正常的易失性写入compareAndSet,但必须set改用。它没有提到任何关于get.

这是否意味着我仍然可以读取具有相同原子性保证的 volatile 字段 - 之前的所有写入setcompareAndSet对所有读取 volatile 字段的人都是可见的?

还是我必须在现场使用getAtomicReferenceFieldUpdater不是 volatile 读取?

如果您有参考资料,请张贴参考资料。

谢谢你。

编辑:

Java Concurrency in Practice中,他们唯一说的是:

更新程序类的原子性保证比常规原子类要弱,因为你不能保证底层字段不会被直接修改 - compareAndSet 和算术方法只保证使用原子字段更新程序方法的其他线程的原子性。

同样,没有提及其他线程应该如何读取这些易失性字段。

另外,我是否可以假设“直接修改”是常规的易失性写入?

0 投票
1 回答
251 浏览

scala - 为什么在 Akka 2.0.2 中不推荐使用 akka.jsr166y.ForkJoinPool?

这是否意味着它将迁移到 Scala 2.10 或 jsr166y 将单独发布?...或者是其他东西?

0 投票
2 回答
3708 浏览

java - 如何正确地将文件添加到 Maven 中的引导类路径?

我在 Java 1.6 中使用了一些JSR166类,其中一些在java.util.concurrent. 我在 OSX 上,但我希望它最终能在 Linux 上运行。

如果我设置这个环境变量,我可以运行我的项目:

我尝试按照此处的说明进行操作,并将设置放入我的pom.xml

不幸的是,这给出了一个关于无法找到的错误java.lang。如果我在中添加对classes.jar(显然是 OSX 的版本rt.jar)的引用,bootclasspath我可以修复该错误,但这只会让我回到我开始的地方:

我应该如何设置 maven 以正确使用此参数?

0 投票
0 回答
111 浏览

java - JDK8 的 ConcurrentHashMap 针对 JDK7 基线的任何基准?

幻灯片“ConcurrentCachingAtGoogle”中,提到了 JDK8ConcurrentHashMap不再使用分段哈希表的实现。

我假设“段”是旧实现用来做的顶级分区。

在增加表时,新实现做了什么,相对于 JDK7 的执行情况如何?

此外,任何关于什么因素(除了空实例的内存占用)推动变化的见解都将受到欢迎。

0 投票
0 回答
523 浏览

java - 在哪里可以下载适用于 Java 8 的 JSR 166?

例如,当我查找 Lambda 规范时,在 JCP 上我确实看到了 JSR 335,我可以将它作为一堆 HTML 下载,然后我可以浏览它。

JSR 166 是否有类似的文档。

我尝试通过并发兴趣组进行抓取,但除了代码之外我找不到任何东西。