从Java内存模型我们知道,每个线程都有自己的线程栈,局部变量放在每个线程自己的线程栈中。
并且 其他 线程无法访问这些局部变量。
那么在什么情况下我们应该同步局部变量呢?
原文由 NingLee 发布,翻译遵循 CC BY-SA 4.0 许可协议
从Java内存模型我们知道,每个线程都有自己的线程栈,局部变量放在每个线程自己的线程栈中。
并且 其他 线程无法访问这些局部变量。
那么在什么情况下我们应该同步局部变量呢?
原文由 NingLee 发布,翻译遵循 CC BY-SA 4.0 许可协议
有两种情况:
int
或 double
。ArrayList
。在第一种情况下,您 无法 同步,因为您只能在对象(由引用类型变量指向)上进行同步。
在第二种情况下,这完全取决于局部变量指向什么。如果它指向其他线程(也可以)也指向的对象,那么您需要确保您的代码已正确同步。
示例:您从 static
或实例字段分配局部变量,或者您从共享集合中获取对象。
但是,如果该对象是在您的线程中创建的并且仅分配给该局部变量,并且您从不从您的线程向另一个线程提供对它的引用,并且对象实现本身也没有提供引用,那么您不需要担心同步。
原文由 Erwin Bolwidt 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2.6k 阅读✓ 已解决
3 回答4.1k 阅读✓ 已解决
8 回答3.8k 阅读
4 回答2.8k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.6k 阅读✓ 已解决
4 回答1.9k 阅读
您正在谈论以下情况:
在上面的代码中,
customer
是一个局部引用变量,但你仍然使用同步块 来限制对对象的访问customer
指向( 一次由一个线程).在 Java 内存模型中, 对象存在于堆中(即使引用对于存在于堆栈中的线程而言是本地的),而同步就是限制一次仅由一个线程访问堆上的对象。
简而言之, 当您说局部变量(非原始变量)时,只有引用是局部的,而不是实际对象本身,即它实际上指的是堆上的一个对象,可以被许多其他线程访问。因此,您需要对对象进行同步,以便单个线程一次只能访问该对象。