Tag: 并发

等待在sun.misc.Unsafe.park(本地方法)

我的应用程序之一挂在负载下运行的一段时间,有没有人知道什么可能导致这样的输出在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.util.concurrent.locks.ReadWriteLock进行@GuardedBy批注

什么是用ReadWriteLock保护字段的正确/首选方式,以便像FindBugs这样的工具可以利用注释? ReadWriteLock的名字应该只写在@GuardedBy注释中。 是否有理由在@GuardedBy注释中只写入读锁的名称,或只是写锁? FindBugs或其他工具是否支持@GuardedBy ReadWriteLock ?

最终的关键字在并发性方面保证了什么?

我想我已经读了一个字段的最后一个关键字保证,如果线程1实例化包含该字段的对象,则线程2将始终看到该字段的初始化值,如果线程2有一个对象的引用(假定它是正确构build)。 它也在JLS中表示 [线程2]也将看到任何对象或数组所引用的最终字段的最终字段是最新的版本的版本。 (JLS第17.5节) 这意味着如果我有A类 class A { private final B b = new B(); private int aNotFinal = 2; … 和B类 class B { private final int bFinal = 1; private int bNotFinal = 2; … 那么aNotFinal不能保证在线程2获得对类A的引用时被初始化,而字段bNotFinal则是,因为B是JLS中指定的最终字段引用的对象。 我有这个权利吗? 编辑: 如果我们有两个线程同时在类C的同一个实例上执行getA(),那么这种情况就可能发生 class C { private A a; public A getA(){ if (a == null){ // […]

在并发代码中返回赋值运算符的值

鉴于以下课程: class Foo { public volatile int number; public int method1() { int ret = number = 1; return ret; } public int method2() { int ret = number = 2; return ret; } } 并给予多个线程在同一个Foo实例上同时调用method1()和method2() ,那么对method1()的调用是否会返回除1之外的任何内容?

我的自旋锁实现是否正确和最佳?

我正在使用旋转锁来保护非常小的关键部分。 争用很less发生,所以自旋锁比普通的互斥锁更合适。 我现在的代码如下,并假定x86和GCC: volatile int exclusion = 0; void lock() { while (__sync_lock_test_and_set(&exclusion, 1)) { // Do nothing. This GCC builtin instruction // ensures memory barrier. } } void unlock() { __sync_synchronize(); // Memory barrier. exclusion = 0; } 所以我想知道: 这段代码是否正确? 它是否正确确保相互排斥? 它是否适用于所有x86操作系统? 它也可以在x86_64上运行吗? 在所有操作系统上? 这是最佳的吗? 我已经看到使用比较和交换的自旋锁实现,但我不知道哪个更好。 根据GCCprimefacesbuild立的文档( http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html )还有__sync_lock_release 。 我不是内存障碍方面的专家,所以我不确定是否可以使用这个来代替__sync_synchronize 。 我正在优化的情况下,没有争议。 我根本不在意争论。 […]

多核和并发 – 语言,图书馆和开发技术

CPU架构的格局已经改变,多核心是一个趋势,将改变我们如何开发软件。 我在C,C ++和Java中完成了multithreading开发,我使用各种IPC机制完成了多进程开发。 使用线程的传统方法似乎并不使开发人员容易使用支持高度并发性的硬件。 您意识到哪些语言,库和开发技术有助于缓解创build并发应用程序的传统挑战? 我显然正在考虑像僵局和竞赛状况这样的问题。 devise技术,库,工具等也是有趣的,有助于实际利用并确保可用资源得到利用 – 只要编写一个安全,可靠的线程化应用程序并不能确保它使用所有可用的内核。 我目前看到的是: Erlang :基于进程的消息传递IPC,即“演员的并发模型” Dramatis :Ruby和Python的演员模型库 Scala :用于JVM的函数式编程语言,增加了一些并发支持 Clojure :具有演员库的JVM的函数式编程语言 白蚁 :Erlang的过程方法和消息传递给Scheme的一个端口 你还知道什么,为你工作了什么,你觉得有什么好看的?

如何在iOS Swift中实现multithreading,并发或并行?

有什么办法可以在Swift中创build一个工作线程?例如,如果有一个主要的function需要大量的计算,并因此导致主线程延迟几秒钟,如果我想将该function移动到单独的线程或不阻塞主线程的线程有没有办法用Swift做到这一点? 我已经浏览了Swift的Apple文档的基本和高级组件,但没有提及并发性或并行性,有谁知道如何做(如果可能)?

Java 8:并行FOR循环

我听说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); } }

Java并发和并行GC

本文中的这篇文章build议使用-XX:+UseParNewGC “使用并行GC启用平行年轻代GC”。 我的困惑是,为了使并行和并发GC,我应该 使用-XX:+UseParNewGC或 同时使用-XX:+UseParNewGC 和 -XX:+UseConcMarkSweepGC ? PS 我正在使用JVM 6。

什么是一些很好的开源c#质量领域模型的例子

我是一个非常年轻的开发者,仍然处于我职业生涯的模拟阶段。 我已经阅读了很多关于并发性等主题,并使用工作单元来允许业务层控制持久性事务。 我甚至实现了一些实现这些主题的痛苦但function性的代码。 但是我从来没有见过真正优雅实现的真实世界的例子。 我没有太多好的TDD,模式聚焦于我身边,所以我不得不去看外面的世界寻求指导。 所以,我正在寻找一些开源企业应用领域模型的一些很好的例子。 最好用c#编写,但其他语言也可以,只要它们是干净优雅的领域模型解决scheme的好例子。 我真正希望看到的一些事情是针对并发性,业务规则和对象validation,事务/工作单元以及半透明日志logging机制的优雅解决scheme。 我也很好奇在领域模型代码中看到一些真实世界的最佳实践是用于exception处理的。 我知道我可以随便开始扯入一些开源项目,并试图从坏的方面破译好,但是我希望这里的专家们能够看到一些项目的好点子,来看看这些努力。 谢谢你的时间。 编辑 我对devise和构build更简单的框架并不感兴趣。 我select框架,还是使用框架是一个必要的考虑,但是这里完全与我的问题分开。 除非这些框架本身是开源的,并且是很好的例子。 我正在寻找的是一个“做得对”的项目,用一个灵活的,易于维护的代码来解决现实世界的问题,以便我能够亲眼看到并理解应该如何完成的一个例子这不是一个微不足道的50行教程的例子。