论坛首页 入门技术论坛

Java同步锁一个技巧

浏览 14448 次
该帖已经被评为新手帖
作者 正文
   发表时间:2010-01-30  
Synchronized(this) 和 Synchronized(mutex)
真的有性能差别吗...楼主真的写代码测试过吗?
synchronized顶多就是可能与自己的一些同步方法互斥吧,也就是说 synchronized(this)块 和 同步方法之间可以保证线程安全 ,如果多个线程同时调用同步方法和执行 synchronized(this)块会牺牲掉一些性能 。
0 请登录后投票
   发表时间:2010-01-31  
原来:private final Object initLock = new Object();
改成:private final byte[] lock = new byte[0];

practical java 有其说明
0 请登录后投票
   发表时间:2010-01-31  
大家都在谈论同步。我想问一下,如果在程序中真的有两个地方用到同一个对象,但是还没有做同步会发生什么样的情况。例如说connection。
0 请登录后投票
   发表时间:2010-01-31  
flying_all 写道
大家都在谈论同步。我想问一下,如果在程序中真的有两个地方用到同一个对象,但是还没有做同步会发生什么样的情况。例如说connection。

我的理解是,有状态的对象,在多线程应用时,必须注意同步的问题,否则,状态容易混乱。
0 请登录后投票
   发表时间:2010-02-01  
这种双锁机制,早就有了。
0 请登录后投票
   发表时间:2010-02-01  
同步就是保护资源的一致
lz这样写是为了保护那些资源呢

你这么些的话只是保证这个块里的资源不能被写,这样你要却 保这个类的其他方法不能修改或读取

不是百分之百的
0 请登录后投票
   发表时间:2010-02-01  
这里重点不在双锁机制,而是锁的粒度...的确应该如LZ说的,锁的粒度达到了最小化了
0 请登录后投票
   发表时间:2010-02-01  
vlinux 写道
能提供一下如何使用这个Reference呢?我乍看一下不明白使用场合呢


public class MethodProxy
{
   private int i,j;
   private final Object initLocki = new Object();
   private final Object initLockj = new Object();

   public void addi()
   {
            synchronized (initLocki)
            {
                i++;
            }
   }

   public void subi()
   {
            synchronized (initLocki)
            {
                i--;
            }
   }

   public void addj()
   {
            synchronized (initLockj)
            {
                j++;
            }
   }

   public void subj()
   {
            synchronized (initLockj)
            {
                j--;
            }
   }
}

不知道这么举例理解合不合适,我想应用场合大约是这样
i与j的操作是两个互不相关的操作,若加同一对象锁或this,就会出现i与j操作的互斥,性能会有不必要的损失
仅仅对同一操作addi、subi及addj、subj加同一对象锁,这样既不存在隐患,且能提高性能
0 请登录后投票
   发表时间:2010-02-01  
runshine 写道
vlinux 写道
能提供一下如何使用这个Reference呢?我乍看一下不明白使用场合呢


public class MethodProxy
{
   private int i,j;
   private final Object initLocki = new Object();
   private final Object initLockj = new Object();

   public void addi()
   {
            synchronized (initLocki)
            {
                i++;
            }
   }

   public void subi()
   {
            synchronized (initLocki)
            {
                i--;
            }
   }

   public void addj()
   {
            synchronized (initLockj)
            {
                j++;
            }
   }

   public void subj()
   {
            synchronized (initLockj)
            {
                j--;
            }
   }
}

不知道这么举例理解合不合适,我想应用场合大约是这样
i与j的操作是两个互不相关的操作,若加同一对象锁或this,就会出现i与j操作的互斥,性能会有不必要的损失
仅仅对同一操作addi、subi及addj、subj加同一对象锁,这样既不存在隐患,且能提高性能


太有才了,通俗易懂的说明了问题,很适合做培训和写技术文章啊,呵呵。
自己的举例能力,真是汗颜,向你学习。
0 请登录后投票
   发表时间:2010-02-01  
hommy8 写道
这里重点不在双锁机制,而是锁的粒度...的确应该如LZ说的,锁的粒度达到了最小化了



还有锁的粒度跟小的你信不信?
0 请登录后投票
论坛首页 入门技术版

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