任何人都可以通过一个例子告诉我同步方法优于synchronized块的优势吗?
每当有关Java同步的问题出现时,有些人非常渴望指出synchronized(this)应该避免的.相反,他们声称,首选锁定私人参考.
一些给出的原因是:
其他人,包括我在内,认为这synchronized(this)是一个被大量使用的习惯用法(也在Java库中),是安全且易于理解的.它不应该被避免,因为你有一个错误,你不知道多线程程序中发生了什么.换句话说:如果适用,则使用它.
我有兴趣看到一些现实世界的例子(没有foobar的东西)避免锁定this是最好的,当synchronized(this)也做的工作.
因此:您是否应始终避免synchronized(this)并使用私有引用上的锁来替换它?
一些进一步的信息(更新为答案):
synchronized方法)和显式形式synchronized(this)synchronized(this)提供,那么synchronized(this)不适用,所以这不是问题如果我在同一个类中有2个同步方法,但每个方法访问不同的变量,那么2个线程可以同时访问这两个方法吗?锁是否发生在对象上,或者它是否与synchronized方法中的变量一样具体?
例:
class X {
private int a;
private int b;
public synchronized void addA(){
a++;
}
public synchronized void addB(){
b++;
}
}
Run Code Online (Sandbox Code Playgroud)
2个线程可以同时访问同一个X类实例x.addA()x.addB()吗?
当我有一个像这样的方法
public void unsynchronizedMethod(){
callSynchronizedMethod();
//dosomestuff after this line
}
Run Code Online (Sandbox Code Playgroud)
是否意味着在调用unsynchronizedMethod() - Method中的callSynchronizedMethod()后,所有内容都是隐式同步的?
有什么区别
public synchronized void addition()
{
//something;
}
Run Code Online (Sandbox Code Playgroud)
和
public void addtion()
{
synchronized (//something)
{
//something;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我错了,请忽略这个问题.
可能重复:
同步块与同步方法?
从对这个问题的公认答案:在Java关键部分中,应该同步什么? 我了解到
public synchronized void foo() {
// do something thread-safe
}
Run Code Online (Sandbox Code Playgroud)
和:
public void foo() {
synchronized (this) {
// do something thread-safe
}
}
Run Code Online (Sandbox Code Playgroud)
做完全一样的事情。但是在第一种情况下,我们仅使对象的一种方法同步,而在第二种情况下,使不可访问的Whole对象。那么,为什么这两个代码片段执行相同的操作?