![](/img/trans.png)
[英]When a lock holds a non-final object, can the object's reference still be changed by another 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.