Java 'synchronized(obj){…}'中'obj'参数的用途是什么?

Java 'synchronized(obj){…}'中'obj'参数的用途是什么?,java,multithreading,concurrency,thread-safety,Java,Multithreading,Concurrency,Thread Safety,这两者有什么区别 public void someMethod(){ synchronized(this){ //some code } } 及 } 另外,请让我澄清一下,如果我在同步括号内提到一个对象,这是否意味着我将能够对该特定对象使用线程安全?使用synchronized关键字时,您需要一个对象作为监视器锁。只有使用相同监视器锁的线程才会被同步 已同步当前实例上已同步的。检查Java中的关键字 当从不同线程对同一实例调用someMethod时,这些线

这两者有什么区别

public void someMethod(){

     synchronized(this){
      //some code

      }
}

}


另外,请让我澄清一下,如果我在同步括号内提到一个对象,这是否意味着我将能够对该特定对象使用线程安全?

使用synchronized关键字时,您需要一个对象作为监视器锁。只有使用相同监视器锁的线程才会被同步

已同步当前实例上已同步的。检查Java中的关键字

当从不同线程对同一实例调用someMethod时,这些线程将被同步。 在不同线程的不同实例上调用someMethod时,这些线程将不会同步。 第二个版本没有任何同步功能,因为每个线程都有自己的方法堆栈,它们将在方法堆栈上创建自己的对象锁


使用synchronized关键字时,需要一个对象作为监视器锁。只有使用相同监视器锁的线程才会被同步

已同步当前实例上已同步的。检查Java中的关键字

当从不同线程对同一实例调用someMethod时,这些线程将被同步。 在不同线程的不同实例上调用someMethod时,这些线程将不会同步。 第二个版本没有任何同步功能,因为每个线程都有自己的方法堆栈,它们将在方法堆栈上创建自己的对象锁


在我们讨论差异之前,让我们首先尝试并理解JAVA中的这个关键字是什么。类的实例可以使用此函数引用自身。可以使用此关键字访问类成员,也可以仅访问非静态成员

现在JAVA中的同步是基于对象的,其中每个对象维护一个监视器,该监视器只允许一个线程访问同步代码块或同步方法。因此,在不同的线程之间共享相同的对象是很重要的,以便它们正确地同步

上面的第一个版本确保了在多个线程之间共享该类的同一实例时的正确同步

第二个版本基本上是在每次调用someMethod时创建一个新对象,这意味着即使该类的同一实例在多个线程之间共享,这些线程中的每个线程都将在锁对象的不同副本上同步,从而有效地导致不同步

为了让事情更清楚一点,这里有一些第一版的其他变体

public void someMethod() {
 // Note that assignment below is redundant and is shown for example purposes.
 Object lock = this;
 synchronized(lock){
    //some code
  }
}

public synchronized void someMethod() {
 //some code
}
至于应该选择哪个版本。这完全取决于方法的作用


若方法执行的所有操作都需要同步,那个么我更喜欢使用synchronized method last选项。这可以防止额外的缩进,并且可读性稍高。否则,第一个变体就有意义了,您可以在同步块之外执行不需要同步的操作。

在讨论差异之前,让我们先尝试了解一下JAVA中的这个关键字是什么。类的实例可以使用此函数引用自身。可以使用此关键字访问类成员,也可以仅访问非静态成员

现在JAVA中的同步是基于对象的,其中每个对象维护一个监视器,该监视器只允许一个线程访问同步代码块或同步方法。因此,在不同的线程之间共享相同的对象是很重要的,以便它们正确地同步

上面的第一个版本确保了在多个线程之间共享该类的同一实例时的正确同步

第二个版本基本上是在每次调用someMethod时创建一个新对象,这意味着即使该类的同一实例在多个线程之间共享,这些线程中的每个线程都将在锁对象的不同副本上同步,从而有效地导致不同步

为了让事情更清楚一点,这里有一些第一版的其他变体

public void someMethod() {
 // Note that assignment below is redundant and is shown for example purposes.
 Object lock = this;
 synchronized(lock){
    //some code
  }
}

public synchronized void someMethod() {
 //some code
}
至于应该选择哪个版本。这完全取决于方法的作用


若方法执行的所有操作都需要同步,那个么我更喜欢使用synchronized method last选项。这可以防止额外的缩进,并且可读性稍高。否则,第一种变体在您可以执行不需要同步块之外的同步的操作时是有意义的。

第二种变体没有意义。同步代码以控制不同线程的重复调用。每次创建一个要同步的新锁就像根本不同步一样。同步处理的是在多个线程内共享代码的关键部分语句,以便一个线程一次执行它。每次调用该方法时,都会初始化局部变量锁。现在,每个线程将创建一个不同的对象,因此它不会被共享。现在怎么办

同步块中的er临界语句将由不同的锁对象保护。您有多个线程同时在同一个关键部分上工作,虽然应用的同步根本无效。这由所有实例方法共享。它不是方法的局部特性。因此,同步是有效的。多个线程将访问由上的同步块保护的代码的关键部分。这将一次进入关键部分,因为这是所有进入实例方法的线程共享的。副本上的答案不回答此问题。另一个问题的答案是解释这意味着什么。但是,我们这里的问题是关于synchronized的含义。不,synchronizedobj不保护obj不被其他线程访问。它所做的主要工作是阻止其他线程进入在同一对象上同步的任何代码块。您可以使用该功能来保护obj,也可以使用它来保护任何其他变量。但是,由您来确保要保护的一个或多个变量只能从同步块内部访问,而同步块都在同一个对象上同步。第二个是没有意义的。同步代码以控制不同线程的重复调用。每次创建一个要同步的新锁就像根本不同步一样。同步处理的是在多个线程内共享代码的关键部分语句,以便一个线程一次执行它。每次调用该方法时,都会初始化局部变量锁。现在,每个线程将创建一个不同的对象,因此它不会被共享。现在,同步块中的任何关键语句都将由不同的锁对象保护。您有多个线程同时在同一个关键部分上工作,虽然应用的同步根本无效。这由所有实例方法共享。它不是方法的局部特性。因此,同步是有效的。多个线程将访问由上的同步块保护的代码的关键部分。这将一次进入关键部分,因为这是所有进入实例方法的线程共享的。副本上的答案不回答此问题。另一个问题的答案是解释这意味着什么。但是,我们这里的问题是关于synchronized的含义。不,synchronizedobj不保护obj不被其他线程访问。它所做的主要工作是阻止其他线程进入在同一对象上同步的任何代码块。您可以使用该功能来保护obj,也可以使用它来保护任何其他变量。但是,由您来确保要保护的一个或多个变量只能从同步块内部访问,这些块都在同一对象上同步。但是我得到了一些不同的结果。@AmartyaKaran,与同步相关的错误是出了名的难以发现和复制。我分析了来自客户站点的崩溃转储,发现了一个大型多线程软件系统中的漏洞,该系统通过了所有测试,并在漏洞暴露之前在该领域运行了相当于数年。但我得到了一些不同的结果。@AmartyaKaran,众所周知,与同步相关的bug很难发现和复制。我分析了来自客户站点的崩溃转储,发现了一个大型多线程软件系统中的漏洞,该系统通过了所有测试,并在漏洞暴露之前在该领域运行了相当于数年。但我得到了一些不同的结果。我有一个demohread类public类demohread{void display{forint j=0;j如果不看你的代码,就不清楚你想做什么。Re,…实际上导致了不正确的同步。我会说,实际上没有同步。SGTM。谢谢你的建议。但是我得到了一些不同的结果。我有一个demohread类public类demohread{void display{forint j=0;jn不看代码,不清楚您正在尝试做什么。Re,…。有效地导致错误的同步。我会说,实际上没有synchronization.SGTM。谢谢您的建议。