问题标签 [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.
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 实现者看到了shutdown
raise是可能的SecurityException
,所以他们就像,“哦,好吧,我将在这里添加一个随机安全检查以确保合规性”......
问题是,阅读 OpenJDK 源代码(openjdk-6-src-b20-21_jun_2010),事实证明,创建任何线程的唯一方法是调用您提供的ThreadFactory(在我的测试用例中从未调用过,因为我没有'不创建任何工作,我不调用prestartCoreThread或preStartAllCoreThreads)。因此,在 OpenJDK 的 ThreadPoolExecutor 中没有明显的原因进行安全检查(就像在 sun-jdk-1.6 中所做的那样,但我没有源代码):
checkShutdownAccess
在做任何事情之前被调用...
如您所见,它无条件地调用checkPermission(shutdownPerm)
安全管理器.... shutdownPerm 定义为... private static final RuntimePermission shutdownPerm = new RuntimePermission("modifyThread");
...据我所知,这绝对没有意义,因为这modifyThread
意味着访问系统线程,并且这里没有系统线程在起作用,事实上,根本没有线程,因为我没有提交任何工作或预启动,即使有线程,它们也会是我的线程,因为我传入了ThreadFactory
. 规范没有说任何关于神奇死亡的内容,除了如果涉及系统线程(它们不是),可能会有一个SecurityException
.
基本上,为什么我不能删除检查系统线程访问的行?我认为没有安全隐患需要它。还有其他人怎么没有遇到过这个问题???我在问题跟踪器上看到了一篇帖子,他们通过将调用更改为 来“解决”了这个问题shutdownNow
,shutdown
显然,这并没有为他们解决这个问题。
java - Fork-join 中的内存可见性
Brian Goetz 在http://www.ibm.com/developerworks/java/library/j-jtp03048.html上写了一篇关于 fork-join 的好文章。在其中,他列出了一种使用 fork-join 机制的合并排序算法,其中他在数组的两侧并行执行排序,然后合并结果。
该算法同时对同一数组的两个不同部分进行排序。为什么不是 AtomicIntegerArray 或其他保持可见性所必需的机制?有什么保证一个线程会看到另一个线程完成的写入,或者这是一个微妙的错误?作为后续,Scala 的 ForkJoinScheduler 是否也做出了这种保证?
谢谢!
java - 交换器似乎不交换()
我有一个非常简单的问题,我尝试在两个任务之间交换一个对象(在这种情况下是一个 int 数组):生产者和消费者。Producer 类生成一个 int 数组,然后尝试使用 Exchanger 对象与 Consumer 数组(这是一个空数组)交换它。但它似乎不起作用:当消费者试图打印数组时,它什么也得不到。
如果我取消注释 Producer 中的行,我会看到生成的数字仍然存在。那么为什么它不交换对象呢?
java - BlockingQueue 和 TransferQueue 的区别
对于 BlockingQueue/LinkedBlockingQueue 与 jsr166y 和 java 7 中的新 TransferQueue/LinkedTransferQueue 类型之间的区别,我有点困惑
java - AtomicReferenceFieldUpdater - 方法 set、get、compareAndSet 语义
来自 JavaAtomicReferenceFieldUpdater
文档:
请注意,
compareAndSet
此类中方法的保证比其他原子类中的要弱。因为这个类不能确保该字段的所有使用都适合原子访问的目的,所以它只能保证对 and 的其他调用的原子性和易失性compareAndSet
语义set
。
这意味着我不能与 一起进行正常的易失性写入compareAndSet
,但必须set
改用。它没有提到任何关于get
.
这是否意味着我仍然可以读取具有相同原子性保证的 volatile 字段 - 之前的所有写入set
或compareAndSet
对所有读取 volatile 字段的人都是可见的?
还是我必须在现场使用get
而AtomicReferenceFieldUpdater
不是 volatile 读取?
如果您有参考资料,请张贴参考资料。
谢谢你。
编辑:
从Java Concurrency in Practice中,他们唯一说的是:
更新程序类的原子性保证比常规原子类要弱,因为你不能保证底层字段不会被直接修改 - compareAndSet 和算术方法只保证使用原子字段更新程序方法的其他线程的原子性。
同样,没有提及其他线程应该如何读取这些易失性字段。
另外,我是否可以假设“直接修改”是常规的易失性写入?
scala - 为什么在 Akka 2.0.2 中不推荐使用 akka.jsr166y.ForkJoinPool?
这是否意味着它将迁移到 Scala 2.10 或 jsr166y 将单独发布?...或者是其他东西?
java - JDK8 的 ConcurrentHashMap 针对 JDK7 基线的任何基准?
在幻灯片“ConcurrentCachingAtGoogle”中,提到了 JDK8ConcurrentHashMap
不再使用分段哈希表的实现。
我假设“段”是旧实现用来做的顶级分区。
在增加表时,新实现做了什么,相对于 JDK7 的执行情况如何?
此外,任何关于什么因素(除了空实例的内存占用)推动变化的见解都将受到欢迎。
java - 在哪里可以下载适用于 Java 8 的 JSR 166?
例如,当我查找 Lambda 规范时,在 JCP 上我确实看到了 JSR 335,我可以将它作为一堆 HTML 下载,然后我可以浏览它。
JSR 166 是否有类似的文档。
我尝试通过并发兴趣组进行抓取,但除了代码之外我找不到任何东西。