我的应用程序之一挂在负载下运行的一段时间,有没有人知道什么可能导致这样的输出在jstack中: "scheduler-5" prio=10 tid=0x00007f49481d0000 nid=0x2061 waiting on condition [0x00007f494e8d0000] java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) – parking to wait for <0x00000006ee117310> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1085) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:807) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1043) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1103) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) at java.lang.Thread.run(Thread.java:722) 挂起时,我在jstack输出中看到了很多。 我大量使用Spring @Async&maps,同步映射&ehcache。 有趣的是,这只发生在一个应用程序实例。 另外两个人跑得很好。 还有什么我可以调查,以获得更多的细节在这种情况下? 我发现这个posthttps://stackoverflow.com/questions/23992787/parking-to-wait-for-0xd8cf0070-a-java-util-concurrent-locks-abstractqueueds,但它不是非常有用的在我的情况。
我听说Java 8提供了很多有关并发计算的实用程序。 所以我想知道什么是最简单的方法来并行给定的循环? public static void main(String[] args) { Set<Server> servers = getServers(); Map<String, String> serverData = new ConcurrentHashMap<>(); for (Server server : servers) { String serverId = server.getIdentifier(); String data = server.fetchData(); serverData.put(serverId, data); } }
我发现上面的注释在书JCIP中被广泛使用。 我认为这是非常有用的,因为即使没有适当的文档,它也说明了有关同步策略的一些事情。 我还看到, Intellij Idea使用这些注释他们现在是否是Java语言本身的一部分?
下面的一段代码是否可以使用Collections.synchronizedMap()重写而不保持并发性的正确性? Collections.synchronizedMap(new WeakHashMap<Class, Object>()); 即有什么来自java.util.concurrent可以用来代替? 请注意,只是replace为 new ConcurrentHashMap<Class, Object>(new WeakHashMap<Class, Object>())); 显然是行不通的
我正在写一个应用程序,将返回一个HashMap给用户。 用户将得到这个MAP的参考。 在后端,我将运行一些将更新地图的线程。 我到目前为止做了什么? 我已经使所有后端线程共享一个公共通道来更新MAP。 所以在后端,我确信并发写入操作不会成为问题。 我遇到的问题 如果用户试图更新MAP,同时在后端更新MAP – >并发写入操作问题。 如果使用尝试从MAP中读取某些内容,并且同时MAP正在后端更新 – >并发READ和WRITE操作问题。 直到现在我还没有遇到这样的问题,但是我担心我将来可能会面临这样的问题。 请给予sugesstions。 我正在使用ConcurrentHashMap<String, String>.
我花了一段时间学习Scala执行上下文,底层线程模型和并发的主题。 你可以解释scala.concurrent.blocking “调整运行时行为”和“可以提高性能或避免死锁”的方式吗? 在文档中 ,它是作为一种手段来等待api不能实现的。 (也许只是长时间运行的计算应该被包装?)。 它到底是什么? 通过源头不容易背叛其秘密。
我想知道shutdown()和shutdownNow()关于Executor Service的基本区别吗?就我所知, shutdown()应该用于正常closures,这意味着所有正在运行并排队等待处理但未启动的任务应该被允许完成并shutdownNow()做一个突然的closures意味着一些未完成的任务被取消,未开始的任务也被取消。 还有什么是隐含的/明确的,我失踪了? PS:我发现了与此有关的另一个问题,但不完全是我想知道的。
所以我有一个程序,产生线程(〜5-150),执行一堆任务。 最初我使用了一个FixedThreadPool因为这个类似的问题表明它们更适合更长寿命的任务,而且由于我对multithreading的知识非常有限,所以我认为线程的平均寿命(几分钟)“ 长寿 ”。 不过,我最近添加了产生额外线程的function,这样做使我超出了我设置的线程限制。 在这种情况下,是否会更好地猜测和增加我可以允许的线程数或切换到CachedThreadPool所以我没有浪费线程? 初步尝试它们,似乎没有什么区别,所以我倾向于使用CachedThreadPool来避免浪费。 然而,线程的寿命是否意味着我应该select一个FixedThreadPool并只处理未使用的线程? 这个问题看起来好像那些额外的线程没有被浪费,但是我希望澄清。
java.util.concurrent API提供了一个名为Lock的类,它基本上将序列化控件以访问关键资源。 它提供了诸如park()和unpark() 。 如果我们可以使用synchronized关键字并使用wait()和notify() notifyAll()方法,我们可以做类似的事情。 我想知道哪一个在实践中更好,为什么?
在Java中是否有一个互斥对象或创build一个? 我问,因为一个信号量对象初始化1许可证不帮助我。 想想这个案例: try { semaphore.acquire(); //do stuff semaphore.release(); } catch (Exception e) { semaphore.release(); } 如果在第一次获取时发生exception,catch块中的释放将增加许可证,而信号量不再是二进制信号量。 请问正确的方法是? try { semaphore.acquire(); //do stuff } catch (Exception e) { //exception stuff } finally { semaphore.release(); } 上面的代码是否确保信号量是二进制的?