Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.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

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_Thread Safety - Fatal编程技术网

在Java线程中,本地对象如何是线程安全的?

在Java线程中,本地对象如何是线程安全的?,java,multithreading,thread-safety,Java,Multithreading,Thread Safety,我一直在读本地对象在Java中是线程安全的,如果它没有被传递到另一个线程。 有人能解释为什么它是线程安全的,因为对象并没有在堆栈中保存? 另一个示例/模式是如何将本地对象传递给另一个线程?如果使用单个线程中的每个对象,则很难创建一个线程安全的程序。在这种情况下,为了“实现”非线程安全,对象必须在内部使用一些全局共享的非线程安全状态,因此不同的对象将从不同的线程访问相同的状态 上面解释了为什么一般认为本地对象是线程安全的。本地对象是线程安全的,因为它只能由一个线程访问 如果您将它传递给另一个线程(

我一直在读本地对象在Java中是线程安全的,如果它没有被传递到另一个线程。 有人能解释为什么它是线程安全的,因为对象并没有在堆栈中保存?
另一个示例/模式是如何将本地对象传递给另一个线程?

如果使用单个线程中的每个对象,则很难创建一个线程安全的程序。在这种情况下,为了“实现”非线程安全,对象必须在内部使用一些全局共享的非线程安全状态,因此不同的对象将从不同的线程访问相同的状态


上面解释了为什么一般认为本地对象是线程安全的。

本地对象是线程安全的,因为它只能由一个线程访问


如果您将它传递给另一个线程(例如通过队列),它将不再是本地的,除非只有一个线程访问它。例如,如果发送线程不再访问它,并且队列是线程安全的,那么如果只有一个线程引用它,那么您的对象可以被视为线程安全的。

开始阅读,比如说您租了一个房间。每次你把房间租给别人时,你必须小心,你没有把房间租给别人。现在,如果你把房间留给一个人,而这个人是唯一可以租房间的人,你在租房间之前不需要做任何检查。房间是不共享的,因此没有空间(没有双关语)进行冲突。线程安全是关于共享状态的。没有共享状态,就没有问题。正如Marko所说,如果一个对象只能从一个线程访问,那么实际上它是“线程安全的”。“局部变量”只能在声明它的方法中访问,因此从局部变量引用的任何对象只能在本地访问,除非您以某种方式将对象引用“传递”到另一个线程。“如果没有传递到另一个线程,为什么它是线程安全的?”嗯,这是因为它没有传递到另一个线程。如果只有一个线程可以使用该对象,那么两个线程同时尝试使用该对象的可能性为零。“…如果它没有被传递给另一个线程…”如果线程A创建了一个对象O,并且它没有在任何其他线程都可以看到的地方存储对O的引用,那么很明显,没有其他线程能够使用对象O。