Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么引用更改时线程不释放锁_Java_Multithreading - Fatal编程技术网

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自己没有锁定受保护的对象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