锁定老帖子 主题:Java同步锁一个技巧
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-01-30
最后修改:2010-01-30
Java5开始虽然引入了高效的 Concurrent 并发包,但同步 synchroize 在一些场合还是需要使用的。 比较典型和我们通常的做法是对某个类成员变量加同步锁,这个变量一般是存储关键数据的。 但许多开源框架中有下面的用法, 例如: Cglib 中的 MethodProxy : package net.sf.cglib.proxy; public class MethodProxy { private Signature sig1; private Signature sig2; private final Object initLock = new Object(); private void init() { if (fastClassInfo == null) { synchronized (initLock) { if (fastClassInfo == null) { CreateInfo ci = createInfo; FastClassInfo fci = new FastClassInfo(); ................. fastClassInfo = fci; } } } } 大家不用关心MethodProxy 是做什么的,只需关注 private final Object initLock = new Object(); 其中,initLock 对象不用来存储数据,而仅仅用来做同步锁对象,这样可以较小锁的粒度,非常高效。 因此, synchronized(this), synchroniezd( 存储用成员变量) 都可以替换为这个模式。 JDK 源码中也有很多这样的模式的范例可以参考。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-01-30
用单独的锁对象是要比锁整个类性能要高出很多。
平常大家直接用在方法上的synchronized 实际上是锁定这个类。 那么不相关业务的锁定都同时锁定该类的话,那么有可能有这样的情景,即两个业务互不相干的,但是却要相互同步(因为方法上都用了synchronized ) |
|
返回顶楼 | |
发表时间:2010-01-30
超级潜水艇 写道 。。。。。。
平常大家直接用在方法上的synchronized 实际上是锁定这个类。 ) 锁定的不是这个类,是这个类当前的对象。 |
|
返回顶楼 | |
发表时间:2010-01-30
lz的 lock对象,我用普通的
private static Object lock = new Object(); 来代替可以吗? |
|
返回顶楼 | |
发表时间:2010-01-30
最后修改:2010-01-30
Mybeautiful 写道 超级潜水艇 写道 。。。。。。
平常大家直接用在方法上的synchronized 实际上是锁定这个类。 ) 锁定的不是这个类,是这个类当前的对象。 说的没错,锁的是实例。 |
|
返回顶楼 | |
发表时间:2010-01-30
zli.ray 写道 lz的 lock对象,我用普通的 private static Object lock = new Object(); 来代替可以吗? 不可以,针对对象实例,不能加 static。 |
|
返回顶楼 | |
发表时间:2010-01-30
raymond2006k 写道 zli.ray 写道 lz的 lock对象,我用普通的
private static Object lock = new Object(); 来代替可以吗? 不可以,针对对象实例,不能加 static。 也就是说,去掉static关键字就可以了,对吗? lz能否解释一下为什么不能加static那?这点不是很理解。 |
|
返回顶楼 | |
发表时间:2010-01-30
zli.ray 写道 raymond2006k 写道 zli.ray 写道 lz的 lock对象,我用普通的
private static Object lock = new Object(); 来代替可以吗? 不可以,针对对象实例,不能加 static。 也就是说,去掉static关键字就可以了,对吗? lz能否解释一下为什么不能加static那?这点不是很理解。 sorry,明白了,加static就共享了。 糊涂了,-_- |
|
返回顶楼 | |
发表时间:2010-01-30
最后修改:2010-01-30
能提供一下如何使用这个Reference呢?我乍看一下不明白使用场合呢
|
|
返回顶楼 | |
发表时间:2010-01-30
Mybeautiful 写道 超级潜水艇 写道 。。。。。。
平常大家直接用在方法上的synchronized 实际上是锁定这个类。 ) 锁定的不是这个类,是这个类当前的对象。 怪我说法不科学。。 静态方法上加synchronized 锁定该类。 实例方法上加synchronized 锁定该实例。 |
|
返回顶楼 | |