【问题标题】:How local objects are thread safe in Java thread?Java线程中的本地对象如何线程安全?
【发布时间】:2014-08-24 12:52:42
【问题描述】:

我一直在阅读本地对象在 Java 中是线程安全的,如果它没有被传递给另一个线程的话。 有人可以解释为什么它是线程安全的,因为对象不在堆栈中维护吗? 还有一个示例/模式,某人如何将本地对象传递给另一个线程?

【问题讨论】:

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

标签: java multithreading thread-safety


【解决方案1】:

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

以上解释了为什么普遍认为本地对象是线程安全的。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-26
      • 2013-12-10
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 2018-07-08
      相关资源
      最近更新 更多