繁体   English   中英

为什么Thread在引用发生变化时不释放锁定

[英]Why Thread not releasing lock when reference has changed

public class UThread implements Runnable {

    Object o;

    UThread(Object o) {
        this.o = o;
    }

    @Override
    public void run() {
        synchronized (o) {
            System.out.println("inside before change" + Thread.currentThread().getName());
            try {
                Thread.sleep(5000);
            } catch (Exception er) {
            }
            o = new Object();
            System.out.println("inside after change" + Thread.currentThread().getName());
            try {
                Thread.sleep(5000);
            } catch (Exception er) {
            }

        }
        System.out.println("outside " + Thread.currentThread().getName());

    }


}


public class main {
    public static void main(String str[]) {

        Object o = new Object();
        UThread uThread = new UThread(o);
        Thread th = new Thread(uThread);

        UThread uThread2 = new UThread(o);
        Thread th2 = new Thread(uThread2);

        th.start();
        try {
            Thread.sleep(1000);
        } catch (Exception er) {
        }
        th2.start();
    }
}

当我们执行它打印的代码时

在changeThread-0之前
在changeThread-0之后
在Thread-0之外
在changeThread-1之前
在changeThread-1之后
在Thread-1之外

那么为什么当我更改对象时,第二个线程没有对o进行锁定。

分配引用不会对基础对象产生任何影响。 它所做的只是复制参考值而不触及或改变对象本身。 它不会例如释放锁也不应该。

例如

Object o2 = o;
synchronized(o) {
    o = new Object();
    // o2 is still locked
}
// o2 is not locked

第二个线程已请求锁定o变量引用的原始对象(在main方法中创建并传递给两个UThread实例的构造函数)。

更改第一个线程的synchronized块内的o值不会改变此线程已锁定o引用的原始对象这一事实,第二个线程也在等待锁定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM