我在工作中修改了一些并发代码,最近还阅读了关于Intrinsic Locks and Synchronization的Java文档.
假设每个对象都有一个内在锁,我为什么要创建一个单独的对象来控制对特定项的访问呢?
我认识到可能存在这样的用例,其中感兴趣的物品不是malloc
‘DObject
(int
vsInteger
),因此没有内在锁,但是……假设我们关心的是同步大约static Object
个数据,还会有什么损失吗?
例如:
public class main {
public static void main (String[] args){
Integer foo = 10;
synchronized(foo){
foo ++;
}
}
}
如果我想从多个线程同步更新foo
,为什么不使用我想要修改的对象呢?这是不是表现得更差了?我看到了许多synchronized(this)
和单独的实例,在这些实例中,我们可以出于同步的目的创建锁对象:
public class main {
public static void main (String[] args){
Integer foo = 10;
Object fooLock = new Object();
synchronized(fooLock){
foo ++;
}
}
}
如果我可以使用实际感兴趣的对象,我为什么要创建fooLock
个呢?这实际上是不受鼓励的(不是惯用的),还是有实际的理由不这样做?
我正在考虑为static
套接字连接对象执行第一种方法(synchronized(foo)
),但我担心的是,我还没有看到关于这方面的讨论.我是不是遗漏了什么?