Java 为什么引用更改时线程不释放锁
当我们执行代码时,它会打印出来Java 为什么引用更改时线程不释放锁,java,multithreading,Java,Multithreading,当我们执行代码时,它会打印出来 更改前的内部线程-0 更改后的内部线程-0 外螺纹-0 更换前内螺纹-1 更换后的内部螺纹-1 外螺纹-1 那么,当我更改对象时,为什么第二个线程没有锁定o。第二个线程已请求锁定o变量引用的原始对象(在主方法中创建并传递给两个UThread实例的构造函数的对象) 在第一个线程的synchronized块内更改o的值不会改变这样一个事实,即该线程已经锁定了由o引用的原始对象,而第二个线程也在等待锁定该对象。分配引用不会对基础对象产生任何影响。它所做的只是复制参考值
更改前的内部线程-0
更改后的内部线程-0
外螺纹-0
更换前内螺纹-1
更换后的内部螺纹-1
外螺纹-1
那么,当我更改对象时,为什么第二个线程没有锁定
o
。第二个线程已请求锁定o
变量引用的原始对象(在主方法中创建并传递给两个UThread
实例的构造函数的对象)
在第一个线程的synchronized块内更改
o
的值不会改变这样一个事实,即该线程已经锁定了由o
引用的原始对象,而第二个线程也在等待锁定该对象。分配引用不会对基础对象产生任何影响。它所做的只是复制参考值,而不接触或改变对象本身。例如,它不会释放锁,也不应该释放锁
e、 g
锁定非最终引用是个坏主意。@AndyTurner确实是个坏主意;不幸的是,Sun自己没有锁定受保护的对象在Writer.java final中,因此每当我将Writer子类化时,我都会从静态分析工具中得到警告。
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();
}
}
Object o2 = o;
synchronized(o) {
o = new Object();
// o2 is still locked
}
// o2 is not locked