使用同步方法而不是同步块是否有优势?
2022-08-31 04:36:53
任何人都可以通过示例告诉我同步方法相对于同步块的优势吗?
任何人都可以通过示例告诉我同步方法相对于同步块的优势吗?
任何人都可以通过示例告诉我同步方法相对于同步块的优势吗?谢谢。
与块相比,使用同步方法没有明显的优势。
也许唯一的一个(但我不会称之为优势)是你不需要包含对象引用。this
方法:
public synchronized void method() { // blocks "this" from here....
...
...
...
} // to here
块:
public void method() {
synchronized( this ) { // blocks "this" from here ....
....
....
....
} // to here...
}
看?根本没有优势。
与方法相比,块确实具有优势,主要是在灵活性方面,因为您可以使用另一个对象作为锁定,而同步方法将锁定整个对象。
比较:
// locks the whole object
...
private synchronized void someInputRelatedWork() {
...
}
private synchronized void someOutputRelatedWork() {
...
}
断续器
// Using specific locks
Object inputLock = new Object();
Object outputLock = new Object();
private void someInputRelatedWork() {
synchronized(inputLock) {
...
}
}
private void someOutputRelatedWork() {
synchronized(outputLock) {
...
}
}
此外,如果该方法增长,您仍然可以将同步部分分开:
private void method() {
... code here
... code here
... code here
synchronized( lock ) {
... very few lines of code here
}
... code here
... code here
... code here
... code here
}
唯一真正的区别是,同步块可以选择它在哪个对象上进行同步。同步方法只能使用(或同步类方法的相应类实例)。例如,它们在语义上是等效的:'this'
synchronized void foo() {
...
}
void foo() {
synchronized (this) {
...
}
}
后者更灵活,因为它可以竞争任何对象(通常是成员变量)的关联锁。它也更精细,因为您可以在块之前和之后执行并发代码,但仍然在方法中。当然,通过将并发代码重构为单独的非同步方法,也可以轻松使用同步方法。使用使代码更易于理解的任何一种。