【问题标题】:What is the difference between a synchronized function and synchronized block? [duplicate]同步函数和同步块有什么区别? [复制]
【发布时间】:2012-01-21 03:01:18
【问题描述】:
有什么区别
public synchronized void addition()
{
//something;
}
和
public void addtion()
{
synchronized (//something)
{
//something;
}
}
如果我错了忽略这个问题。
【问题讨论】:
标签:
java
multithreading
locking
synchronized
【解决方案1】:
public synchronized void addition() {...}
等价于
public void addition() {
synchronized(this) { ... }
}
现在,如果您将 this 替换为不同的对象引用,则锁定将使用该其他对象的监视器完成。
【解决方案2】:
第二个没有编译。如果你的意思是
public void addition()
{
synchronized (this)
{
//something;
}
}
那么它们是等价的。
【解决方案3】:
如果第二个例子是synchronized (this),那么没有区别。如果是别的东西,那么锁对象就不一样了。
【解决方案4】:
public synchronized void addition()
{
//something;
}
等同于:
public void addtion()
{
synchronized (this)
{
//something;
}
}
然而,在您的第二个示例中,您可能希望使用不同于 this 的内容进行同步。
【解决方案6】:
同步方法在“this”对象上同步。如果它是一个块,你可以选择任何对象作为锁。
【解决方案7】:
我)
public synchronized void addition()
{
//something;
}
二)
public void addtion()
{
synchronized (//something)
{
//something;
}
}
在第一版(method level synchronization)中,一次完整的方法体只能由一个线程执行。
然而,版本 II 更灵活,因为它被称为 block level synchronization,您可以在 synchronized (//something) 上方添加一些行以并行执行它们。应该是synchronized (this)
应该首选版本 II,因为只有代码需要是关键的多线程(在同步内)。