Tag: 并发

处理ThreadPoolExecutor的exception

我有以下代码片段,它基本上扫描需要执行的任务列表,然后将每个任务提供给执行程序执行。 JobExecutor反过来创建另一个执行程序(用于执行数据库内容…读取和写入数据到队列)并完成任务。 JobExecutor为提交的任务返回Future 。 当其中一个任务失败时,我想优雅地中断所有线程并通过捕获所有exception来关闭执行程序。 我需要做哪些改变? public class DataMovingClass { private static final AtomicInteger uniqueId = new AtomicInteger(0); private static final ThreadLocal uniqueNumber = new IDGenerator(); ThreadPoolExecutor threadPoolExecutor = null ; private List sources = new ArrayList(); private static class IDGenerator extends ThreadLocal { @Override public Integer get() { return uniqueId.incrementAndGet(); } } public void […]

如何调试ConcurrentModificationException?

我遇到了ConcurrentModificationException,通过查看它,我看不出它为什么会发生的原因; 抛出exception的区域和修改集合的所有位置都被包围 synchronized (this.locks.get(id)) { … } // locks is a HashMap; 我试图抓住讨厌的线程,但我所能指出的(通过在exception中设置断点)是抛出线程拥有监视器而另一个线程(程序中有两个线程)睡眠。 我该怎么办? 当遇到类似的线程问题时,您通常会做什么?

Java中的Peterson算法?

在Java中是否存在用于互斥的Peterson算法的示例实现?

Java Concurrency in Practice – 示例14.12

// Not really how java.util.concurrent.Semaphore is implemented @ThreadSafe public class SemaphoreOnLock { private final Lock lock = new ReentrantLock(); // CONDITION PREDICATE: permitsAvailable (permits > 0) private final Condition permitsAvailable = lock.newCondition(); @GuardedBy(“lock”) private int permits; SemaphoreOnLock(int initialPermits) { lock.lock(); try { permits = initialPermits; } finally { lock.unlock(); } } /* other code omitted…. […]

在Java JVM中重新排序的说明

我正在阅读这篇博文: http : //jeremymanson.blogspot.hk/2008/12/benign-data-races-in-java.html 作者在谈论在multithreading环境中打破String中的hashCode() 。 有了: public int hashCode() { int h = hash; if (h == 0) { int off = offset; char val[] = value; int len = count; for (int i = 0; i < len; i++) { h = 31*h + val[off++]; } hash = h; } return h; } […]

java.util.ConcurrentLinkedQueue

我想使用java.util.ConcurrentLinkedQueue作为Servlet的非持久队列。 这是来自类的javadoc的模糊。 基于链接节点的无界线程安全队列。 当许multithreading共享对公共集合的访问权限时,ConcurrentLinkedQueue是一个合适的选择。 此队列不允许null元素。 现在假设我在servlet上有1000个并发请求,每个线程都需要将一个对象嵌入到ConcurrentLinkedQueue中。 从描述中,我应该得出结论,处理负载没有问题吗? 我需要的保证是: 我自动收到线程安全保证,而无需自己进行同步。 如果流量负载超过1000并发请求,我将不会丢失任何请求。 谢谢

JProgressBar不会更新

我正在尝试将JProgressBar添加到我的程序中,但它不会更新! 只有在100%的原因后,该值才会更改。 这是我的方法。 public void downloadImages(List images) { if (errorCode == 0) { for (int i = 0; i < images.size(); i++) { if (errorCode == 0) { main.progressLabel.setText("Downloading image " + Integer.toString(i + 1) + " of " + Integer.toString(images.size())); String imageStr = images.get(i); String imageName = imageStr.substring(imageStr.lastIndexOf("/") + 1); try { URL url […]

外部和内部类方法之间的锁定和同步?

我的问题是,如果我有一些像以下代码 – : public class OuterClass{ public class InnerClass{ public synchronized methodA(){ /* does something */} } } 现在当多个线程想要调用内部类方法时,它们将获取外部类对象或内部类对象的锁定,以及如何修改语句以便我同步访问外部类对象/

嵌套的Java 8并行forEach循环表现不佳。 这种行为有望吗?

注意:我已经在另一个SOpost中解决了这个问题 – 在嵌套的Java 8并行流动作中使用信号量可能是DEADLOCK。 这是一个错误吗? – 但是这篇文章的标题表明问题与使用信号量有关 – 这有点分散了讨论的注意力。 我正在创建这个,以强调嵌套循环可能有性能问题 – 虽然这两个问题可能是一个共同的原因(也许是因为我花了很多时间来弄清楚这个问题)。 (我不认为它是重复的,因为它强调另一种症状 – 但如果你只是删除它)。 问题:如果你嵌套两个Java 8 stream.parallel()。forEach循环并且所有任务都是独立的,无状态的等等 – 除了被提交到公共FJ池 – 然后在并行循环内嵌套并行循环执行得更差而不是在并行循环内嵌套顺序循环。 更糟糕的是:如果同步包含内循环的操作,您将获得DEADLOCK。 演示性能问题 如果没有“同步”,您仍然可以观察到性能问题。 您可以在以下url找到演示代码: http : //svn.finmath.net/finmath%20experiments/trunk/src/net/finmath/experiments/concurrency/NestedParallelForEachTest.java (有关更详细的说明,请参阅JavaDoc)。 我们的设置如下:我们有一个嵌套的stream.parallel()。forEach()。 内环是独立的(无状态,无干扰等 – 除了使用公共池之外)并且在最坏的情况下总共消耗1秒,即如果是顺序处理的话。 外循环的一半任务在该循环之前消耗10秒。 在该循环之后,一半消耗10秒。 因此,每个线程总共消耗11秒(最坏情况)。 *我们有一个布尔值,允许将内部循环从parallel()切换到sequential()。 现在:将24个外循环任务提交到具有并行性的池8我们预计24/8 * 11 =最多33秒(在8核或更好的机器上)。 结果是: 内部顺序循环:33秒。 内部并行循环:> 80秒(我有92秒)。 问题:你能证实这种行为吗? 这是人们对框架的期望吗? (我现在更加小心,声称这是一个错误,但我个人认为这是由于ForkJoinTask的实现中的一个错误。备注:我已将此发布到并发兴趣(请参阅http:// cs.oswego.edu/pipermail/concurrency-interest/2014-May/012652.html ),但到目前为止我没有得到确认)。 certificate了僵局 以下代码将为DEADLOCK // Outer […]

不是线程安全的对象发布

在实践中阅读Java并发,第3.5节:提出索赔 public Holder holder; public void initialize() { holder = new Holder(42); } 除了创建2个Holder实例的明显线程安全危险之外,该书声称可能会出现一个可能的发布问题,对于Holder类来说更是如此 public Holder { int n; public Holder(int n) { this.n = n }; public void assertSanity() { if(n != n) throw new AssertionError(“This statement is false.”); } } 可以抛出AssertionError! 这怎么可能 ? 我能想到的唯一可以允许这种荒谬的行为是,如果Holder构造函数不会被阻塞,那么当构造函数代码仍在不同的线程中运行时,将为该实例创建一个引用。 这可能吗 ?