同步函数和同步块之间有什么区别?
有什么区别
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(在同步中),这是至关重要的。