【发布时间】:2020-11-27 06:47:42
【问题描述】:
关于同步的堆栈溢出有很多资料,但我仍然没有获得关于决定将哪个对象用作内在锁的高质量内容。根据经验,有人真的能做出一个好的答案吗?
那么我应该选择“监视器”作为实例变量还是局部变量或拥有该方法的实例?他们三个都很好地完成了这项工作。原始值包装类也使用“池”,因此也没有问题,因为线程“攻击”相同的锁。
那么为什么这样做更好(这个):
class A {
void methodA(){
synchronized (this){
//some code
}
}
}
对此(实例变量):
class A {
String monitor = "monitor";
void methodA(){
synchronized (monitor){
//some code
}
}
}
或者超过这个(局部变量):
class A {
void methodA(){
String monitor = "monitor";
synchronized (monitor){
//some code
}
}
}
它们都工作正常/相同。那么为什么我读到当局部变量隐式使用池来存储对象时我应该避免使用它们呢?在这种情况下,变量的范围有什么影响?
谢谢!
【问题讨论】:
-
他们不“都工作正常/相同”。在局部变量上同步完全没有任何作用,因为每个调用者都有自己的值。在实例成员而不是实例上进行同步可以让您进行更细粒度的控制:您可以为不同的操作设置不同的监视器,而不会相互干扰。
标签: java multithreading synchronization