论坛首页 入门技术论坛

Java同步锁一个技巧

浏览 14446 次
该帖已经被评为新手帖
作者 正文
   发表时间:2010-01-30   最后修改:2010-01-30
Synchronized 同步
  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 源码中也有很多这样的模式的范例可以参考。

   发表时间:2010-01-30  
用单独的锁对象是要比锁整个类性能要高出很多。
平常大家直接用在方法上的synchronized 实际上是锁定这个类。
那么不相关业务的锁定都同时锁定该类的话,那么有可能有这样的情景,即两个业务互不相干的,但是却要相互同步(因为方法上都用了synchronized )
0 请登录后投票
   发表时间:2010-01-30  
超级潜水艇 写道
。。。。。。
平常大家直接用在方法上的synchronized 实际上是锁定这个类。 )

锁定的不是这个类,是这个类当前的对象。
0 请登录后投票
   发表时间:2010-01-30  
lz的 lock对象,我用普通的
private static Object lock = new Object();

来代替可以吗?
0 请登录后投票
   发表时间:2010-01-30   最后修改:2010-01-30
Mybeautiful 写道
超级潜水艇 写道
。。。。。。
平常大家直接用在方法上的synchronized 实际上是锁定这个类。 )

锁定的不是这个类,是这个类当前的对象。


说的没错,锁的是实例。
0 请登录后投票
   发表时间:2010-01-30  
zli.ray 写道
lz的 lock对象,我用普通的
private static Object lock = new Object();

来代替可以吗?


不可以,针对对象实例,不能加 static。
0 请登录后投票
   发表时间:2010-01-30  
raymond2006k 写道
zli.ray 写道
lz的 lock对象,我用普通的
private static Object lock = new Object();

来代替可以吗?


不可以,针对对象实例,不能加 static。

也就是说,去掉static关键字就可以了,对吗?
lz能否解释一下为什么不能加static那?这点不是很理解。
0 请登录后投票
   发表时间:2010-01-30  
zli.ray 写道
raymond2006k 写道
zli.ray 写道
lz的 lock对象,我用普通的
private static Object lock = new Object();

来代替可以吗?


不可以,针对对象实例,不能加 static。

也就是说,去掉static关键字就可以了,对吗?
lz能否解释一下为什么不能加static那?这点不是很理解。

sorry,明白了,加static就共享了。
糊涂了,-_-
0 请登录后投票
   发表时间:2010-01-30   最后修改:2010-01-30
能提供一下如何使用这个Reference呢?我乍看一下不明白使用场合呢
0 请登录后投票
   发表时间:2010-01-30  
Mybeautiful 写道
超级潜水艇 写道
。。。。。。
平常大家直接用在方法上的synchronized 实际上是锁定这个类。 )

锁定的不是这个类,是这个类当前的对象。

怪我说法不科学。。
静态方法上加synchronized 锁定该类。
实例方法上加synchronized 锁定该实例。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics