【发布时间】:2012-04-06 12:23:21
【问题描述】:
我正在修改一些非常复杂的代码,我需要在此基础上添加自己的同步。
但是,现有代码有大约十几个(如果不是更多的话)不同的锁,我的代码需要调用它的一些方法。我真的不知道获取锁的顺序,也无法真正控制。
所以,我的问题是,如果我用一个锁替换所有不同的锁会发生什么?。除了牺牲粒度之外,还有什么我应该注意的问题吗?
谢谢!
【问题讨论】:
-
能发一下代码的sn-p吗?
-
不,这就像 3000+ 行。 :-D 这不是我的代码,请注意...
-
据我了解,如果你需要所有方法的原子性,你需要一个锁,如果你想要公平,这样每个线程将按照他们寻求的顺序由处理器提供服务资源,你可以看一下 java.util.concurrent.Lock (它保证了公平性,但它带来了开销)。请阅读 ibm.com/developerworks/java/library/j-jtp09238/index.html 和 ibm.com/developerworks/java/library/j-jtp10264 以更好地了解锁和在 java 中的先发生顺序。
-
上周已经深入研究了不属于我的多线程代码,我可以告诉你,这并不容易,你可能需要花时间真正了解这段代码。在不了解代码当前如何工作的情况下,我会犹豫盲目地更换锁。幸运的是,JVM 非常擅长检测死锁,所以如果您还没有学习过,您应该学习如何捕获和读取线程转储。最后,在没有看过代码的情况下,我会说你绝对应该更喜欢 java.util.concurrent 中的工具,而不是任何自制的锁定解决方案。
标签: java multithreading synchronization locking