同步函数和同步块之间有什么区别?

有什么区别

public synchronized void addition() { //something; } 

 public void addtion() { synchronized (//something) { //something; } } 

如果我错了,请忽略这个问题。

它是第一个只有一个线程可以一次执行整个方法,而在第二个线程中只有一个线程可以执行该同步块,如果不将用作参数。

这里是它的副本使用同步方法而不是同步块是否有优势?

 public synchronized void addition() {...} 

相当于

 public void addition() { synchronized(this) { ... } } 

现在,如果用另一个对象引用替换this ,则将使用该另一个对象的监视器完成锁定。

第二个不编译。 如果你的意思

 public void addition() { synchronized (this) { //something; } } 

然后他们是等同的。

如果第二个例子是synchronized (this) ,那么没有区别。 如果它是其他东西,那么锁定对象是不同的。

 public synchronized void addition() { //something; } 

是相同的:

 public void addtion() { synchronized (this) { //something; } } 

然而,在您的第二个示例中,您可能希望使用与this不同的内容进行同步。

同步方法在“this”对象上同步。 如果是块,您可以选择任何对象作为锁。

一世)

 public synchronized void addition() { //something; } 

II)

 public void addtion() { synchronized (//something) { //something; } } 

在版本I( method level synchronization )中,方法的完整主体一次只能由一个线程执行。

但是,版本II更灵活,因为它被称为block level synchronization ,您可以在synchronized (//something)之上添加一些行来并行执行它们。 它应该synchronized (this)

版本II应该是首选,因为只有代码需要multithreading(在同步中),这是至关重要的。