Java中的“synchronized(this)”vs.“synchronized((BaseClass)this)”

前端之家收集整理的这篇文章主要介绍了Java中的“synchronized(this)”vs.“synchronized((BaseClass)this)”前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是我上一个问题 Is this variable being safely accessed by using synchronization?的继承人

对于以下程序,

Class SubClassB extends SuperClassA {
     protected int c;

     public void inc() {
          synchronized (this) {
               c++;
          }
     }

     public void dec() {
          synchronized ( (SuperClassA) this) {
               c--;
          }
     }
}@H_301_5@ 
 

计数器“c”是否被访问线程安全?我不确定在“dec()”方法中,SuperClassA是否为“this”引用同步块的有效对象?如果是,两个同步块是否锁定相同的“this”对象? (在我看来,“(SuperClassA)这个”不等于“这个”)

这个奇怪的模拟代码来自以下现实生活中的例子,其中SuperClassA是一个不被修改的基类,

Class SuperClassA {
     protected int c;

     public void dec() {
          synchronized (this) {
               c--;
          }
     }
}

Class SubClassB extends SuperClassA {

     public void inc() {
          synchronized (this) {
               c++;
          }
     }

     public void dec() {
          super.dec();
     }
}@H_301_5@ 
 

在这个例子中,SubClassB中的“dec()”方法调用其超类的“dec()”方法,该方法对我认为是“SuperClassA.this”的“this”对象执行锁定.如果SubClassB的“inc()”方法中的锁定对象与SubClassB的“dec()”方法中的锁定对象不完全相同,那么我想知道SubClassB中继承的计数器“c”可能不会被不同的线程安全地访问.我觉得在同步块中使用“this”引用有一些歧义.

在现实生活的例子中,如果我希望SubClassB的计数器“c”是线程安全的,那么我需要在其“dec()”方法添加一个更多的同步块,就像这样,

Class SubClassB extends SuperClassA {

     public void inc() {
          synchronized (this) {
               c++;
          }
     }

     public void dec() {
          synchronized (this) {
               super.dec();
          }
     }
}@H_301_5@ 
 

但似乎这样添加的块不是优雅的,可能是多余的!

有人对这些问题有一些想法.提前致谢.

劳伦斯

解决方法

Would the counter “c” be accessed thread safe ?

是的,它使用相同的锁定对象.

I am not sure that in the “dec()” method,is the SuperClassA cast “this” reference a valid object for the synchronized block ?

是.

If yes,would the two synchronized blocks lock the same “this” object ? (As it seems to me that “(SuperClassA) this” is not equal to “this”)

是.即使将实例转换为可以转换为(甚至Object)的实例,它仍将引用相同的对象.

[…] But it seems that such added block is not elegant and may be redundant !

这是多余的.仅当您调用多个同步方法并且组合效果必须为原子时,才需要额外的同步.

猜你在找的Java相关文章