草庐IT

concurrent-mark-sweep

全部标签

java - 为什么 Java Concurrency In Practice list 5.18 不能用锁自动完成?

在JavaConcurrencyinPractice的第106页上,它说“Memoizer3容易受到问题[两个线程看到null并开始昂贵的计算]因为复合操作(put-if-absent)在无法使用锁定使其成为原子的支持映射上执行。”我不明白为什么他们说不能使用锁定使其成为原子。原代码如下:packagenet.jcip.examples;importjava.util.*;importjava.util.concurrent.*;/***Memoizer3**MemoizingwrapperusingFutureTask**@authorBrianGoetzandTimPeierls*

java - "Java concurrency in practice"- 缓存的线程安全数字分解器( list 2.8)

在以下代码中(复制自JavaConcurrencyinPractice第2章,第2.5节,list2.8):@ThreadSafepublicclassCachedFactorizerimplementsServlet{@GuardedBy("this")privateBigIntegerlastNumber;@GuardedBy("this")privateBigInteger[]lastFactors;@GuardedBy("this")privatelonghits;@GuardedBy("this")privatelongcacheHits;publicsynchronized

java - 为什么 Scala 构建自己的 ForkJoinPool 而不是使用 java.util.concurrent.ForkJoinPool#commonPool?

这个问题在这里已经有了答案:scala.concurrent.forkjoin.ForkJoinPoolvsjava.util.concurrent.ForkJoinPool(1个回答)关闭2年前。Java和Scala都引入了自己的全局ForkJoinPool,Java为java.util.concurrent.ForkJoinPool#commonPool,Scala为scala.concurrent.ExecutionContext#global。这两个似乎都旨在用于相同的用例,特别是运行非阻塞并发任务(通常是隐式的)。现在据我所知,如果你以错误的方式选择互操作依赖项,你最终会得到

java - 什么时候使用 java.util.concurrent.Semaphore 的 acquire() 和 acquireUninterruptibly() 方法?

我是Java并发/多线程的新手。有人可以向我解释在什么情况下必须(或不能)使用acquire()和acquireUninterruptibly(),它们有何不同;以及如何使用它们(代码示例?)。非常感谢。 最佳答案 acquire()是可中断的。这意味着如果线程A在信号量上调用acquire(),并且线程B通过调用interrupt()中断线程A,则InterruptedException将在线程A上抛出。另一方面,acquireUninterruptibly()是不可中断的。这意味着如果线程A在信号量上调用acquireUnint

java - 为什么 java.util.concurrent.TimeUnit.convert 抛出 AbstractMethodError 而不是抽象

java.util.concurrent.TimeUnit有这个来源:publiclongconvert(longsourceDuration,TimeUnitsourceUnit){thrownewAbstractMethodError();}为什么这不是一个抽象方法abstractintexcessNanos(longd,longm); 最佳答案 方法声明上方的单行注释如下,//Tomaintainfullsignaturecompatibilitywith1.5,andtoimprovethe//clarityofthegen

java.util.concurrent.LinkedBlockingQueue put 方法在 Scala 中需要 Nothing 作为参数

这是代码片段-importjava.util.concurrent.LinkedBlockingQueuedefmain(args:Array[String]){valqueue=newLinkedBlockingQueuequeue.put("foo")}这给了我-错误:类型不匹配;找到:java.lang.String("foo")要求:无queue.add("foo")我的理解是因为我没有指定进入队列的元素的类型。如果是这样,我们如何在Scala中为LinkedBlockingQueue指定类型而不是默认的通用类型? 最佳答案

java - 内存屏障和 java.util.concurrent.locks.Condition 示例

我对使用Lock提供的Condition时的内存屏障有疑问。关于thejavadocforCondition中提供的示例,我有一个关于使用的问题:intputptr,takeptr,count;难道不应该将这些属性声明为volatile吗?正如我从示例中理解的那样,线程可能看不到例如count的修改。或者是说,当signal()被调用时,自获得锁以来所做的所有修改对其他线程都是可见的?很像synchronizedblock中的一些代码吗?如果是,当调用signal()时,或者当调用锁上的unlock()时,修改是否可见?谢谢。编辑:我在Lock的javadoc中看到:AllLockim

java - 避免在 Java CMS GC 中升级失败

我有一个使用CMS垃圾收集的Java应用程序,它每天都会遭受几次“ParNew(提升失败)”完整GC(请参见下面的示例)。我知道当垃圾收集无法在老一代中找到足够的(连续的)空间来将新一代对象提升到其中时,就会发生提升失败。在这一点上,它被迫进行昂贵的stop-the-worldfullGC。我想避免此类事件。我已经阅读了几篇建议可能的解决方案的文章,但我想在这里澄清/巩固它们:-Xmx:增加堆大小,例如。从2G到4G——为老一代提供更多余量的简单解决方案——根据我的经验,似乎工作得相当好-XX:NewRatio:增加NewRatio,例如。从2到4,为了增加老一代/减少新一代——给老一

java - 为什么 Queue.poll 比 Iteration 快? (java.util.concurrent.ConcurrentLinkedQueue)

我有一段代码可以从队列中获取所有元素。之后我不关心队列的状态,我可以确信在我从队列中删除元素时队列不会被修改。我最初使用迭代器来提取元素,因为我认为它比轮询元素更快...但我运行了以下测试:ConcurrentLinkedQueuequeue=newConcurrentLinkedQueue();for(inti=0;ilist=newLinkedList();longstart=System.currentTimeMillis();for(Objectobject:queue)list.add(object);longtime1=System.currentTimeMillis()-

java - 使用 java.util.concurrent.Executor 阻止 tomcat 停止

背景:我需要使用java.util.concurrent.Executor来序列化WebService中一些遗留代码的执行。我在WebService类中添加了一个成员变量executor。它由springframework从外部注入(inject)。执行器bean定义如下:Tomcat版本:6.0.22Java版本:1.6Spring框架:2.5.5问题:WS按预期工作。我们将它推出到Linux服务器上。然后我们意识到tomcat停止脚本不能再停止服务。我对tomcat实例使用kill-3。在线程转储中,我找到了这些行:"pool-2-thread-1"prio=10tid=0xad6