这是我从java.lang.Thread 中拷出的一段代码,我想问的是,blockLock用来锁谁的,
每创建一个线程,这个对象锁就不同,它还能同步吗?private volatile Interruptible blocker;
    private Object blockerLock = new Object();    /* Set the blocker field; invoked via sun.misc.SharedSecrets from java.nio code
     */
    void blockedOn(Interruptible b) {
synchronized (blockerLock) {
    blocker = b;
}
    }

解决方案 »

  1.   

    “blockLock用来锁谁的”这句话说的很让人很费解。下面这句话是用来“锁住”blockerLock对象的。
    synchronized (blockerLock) {
      blocker = b;
    }
    这样就保证了,同一个时间点修改blocker值的线程只有一个!
      

  2.   

    这个。好像blockerLock要声明为static final
      

  3.   

    三楼的明白我的想法,因为blockLock 是实例变量,每创建一个Thread 对象就会跟着创建一个blockLock对象,让线程在blockLock 同步,它能同步上吗?下面是我的测试,System.out.println(one.getObj() == two.getObj()); 打出来的结果是 false.public class Hello
    {
        private Object obj = new Object();    public static void main(String[] args)
        {
            Hello one = new Hello();
            Hello two = new Hello();
            System.out.println(one.getObj() == two.getObj());
        }    public Object getObj()
        {
            return obj;
        }    public void setObj(Object obj)
        {
            this.obj = obj;
        }
    }
      

  4.   

    3楼的说的对,就是要static final的,不过如果是自己实现的话,Interruptible就可以用到单例模式,这样就能保证一直都是同一个对象,也就是线程同步了!
      

  5.   

    blockerLock要声明为static final
      

  6.   

    各位要看清了, 这是java.lang.Thread中的代码,blockerLock 没有 static final的,而我工作中的代码是别人写的,也有几个这种写法,我不知道是自己不懂,还是别人写错了,这样的同步根本没作用。
      

  7.   

    火龙果说得很清楚了,如果blockerLock是在blockedOn方法中生成的,那确实同步是没有任何作用,但现在blockedOn是个类对象,那么多线程访问同一个类的对象时,是实现了同步的,因为只有一个可以获取到monitor lock
      

  8.   

    楼主可以参看
    http://blog.csdn.net/axman/archive/2005/07/22/431802.aspx
    这片博文。我觉得就是文中说的虚拟锁的应用,让同步区域(资源)更小化。
      

  9.   

    9楼兄弟,blockOn是个类对象吗?它是一个方法吧,2楼兄弟,我觉得他没看我问题就写答案了
      

  10.   

    口误,我说的是blockerLock这个类对象,不知道你还在纠结什么
      

  11.   

    blockerLock这个对象是类对象吗?13楼兄弟
      

  12.   

    这个应该是为了让外部对当前某一Thread(A)的中断标志做处理的时候的同步处理方式,外部线程(B)对线程(A)做中断设置,这里使用虚拟线程锁,缩小同步范围,则达到外部线程B设置中断标志的时候,A线程照常运行其他方法,不因此而阻塞。
    整个都是同一个线程A的事情,并不是A跟别的线程A1,A2这些兄弟线程之间同步什么,他们也个人有个人的blockerLock,用来应付外部设置中断标志的时候自身不被阻塞。
      

  13.   

    纠结在:不同的线程它有自己的blockerLock对象,所以
    synchronized (blockerLock) {
    blocker = b;
    }
    同步我觉得没用,
      

  14.   

    blockerLock沒有定义在方法blockOn里,不是类对象是什么?
      

  15.   

    那来的多线程访问同一对象?我这小段代码是java.lang.Thread中的,创建一个Thread object, also create a blockerLock object, the object monitor is difference.
      

  16.   

    我工作中的代码完全是为了让线程阻塞的作用,和sleep 作用一个样,但是可以阻塞任意时间。有个暂停通知的作用,并没有多个线程来同步。