java - 同步(this)和同步(其他对象)之间有什么区别

标签 java multithreading synchronization thread-safety

Public Class A
{
  private Object memberlockObject = new Object();

  public doStuffapproach1(){

      synchronized(this){
               // Do something;
      }
  }

 public doStuffapproach2(){

      synchronized(memberlockObject){
               // Do something;
      }
 }

 public doStuffapproach3(Object parameterLockObject){

      synchronized(parameterLockObject){
               // Do something;
      }
 }

}

在上面的代码中,doStuffapproach1、doStuffapproach2、doStuffapproach3方法是否实现了相同类型的 block 同步。 如果不是,它们有何不同。 分别在什么场景下使用?

P.S:我知道方法级同步与在(this)上同步整个方法体一样好。

最佳答案

当你使用synchronized关键字时,你需要定义一个对象来用作监视器。

synchronized(this)使用当前对象作为监视器

synchronized(otherObject) 使用另一个对象作为监视器

如果您需要在不同类中的同一对象上进行同步,那么至少其中一个类需要在与 this 不同的对象上进行同步。

请注意,将方法隐式定义为同步将在this上同步(如果该方法不是静态)。

<小时/>

doStuffapproach1 方法对此进行同步,因此同一对象上对该方法的任何调用都会同步。

doStuffapproach2 的工作方式与 doStuffapproach1 完全相同,因为您锁定的对象在当前对象中具有唯一的实例。

doStuffapproach3 的工作方式有所不同,因为您传递监视器并取决于您作为参数传递的内容。

关于java - 同步(this)和同步(其他对象)之间有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37805284/

相关文章:

Java 强制停止线程在循环周期内执行

c# - 同步 pdf 打印和标准打印

java - volatile 变量并刷新到主内存/从主内存读取

java - 多对多关系 : save the transient instance before flushing

java - 最RESTful文件发送Java Spring

java - 如何将 Vaadin 7 服务器推送应用到导航 View

c - scanf() 在线程中不起作用

java - 如何获取线程的id?

java - 在GUI中动态更新JTextArea

Java双重检查锁定解决方案?