我在Java中使用synchronized块的概念时遇到了一些麻烦。我觉得我已经很好地理解了同步方法。所以我想到了一个类比来帮助我理解同步方法中的同步块。如果我提出的这种等同性是正确的,请告诉我。另外,我现在只提到了非静态同步块。但是,也欢迎静态同步块上的点。
<source>
相当于
public void method()
{
//code snipppet A
synchronized(objRef)
{
//code snipppet B
}
//code snipppet C
}
在objRef类中:
public void method() {
//code snippet A
objRef.sync_method();
//code snippet C
}
这个类比基于同步块的行为与同步方法一样的逻辑。这意味着一旦线程获得监视器上的锁定,它就不允许其他线程干扰其执行。只有在完成整个同步方法的执行后,线程才会放弃控制。
答案 0 :(得分:2)
有可能你没有把一切都弄好。例如,
synchronized(objRef) {
objRef.nonsync_method();
... more code ...
}
不等于
objRef.sync_method();
因为在前一种情况下,锁覆盖了代码的更大部分。
之间存在等价synchronized void sync_method() {
// stuff
}
和
void nonsync_method() {
synchronized (this) {
// stuff
}
}
此外,
一旦线程获得监视器上的锁定,它就不允许其他线程干扰其执行
以上可能或可能不是,这取决于我们如何解释含糊不清的措辞。获取锁的线程可能很容易让其他线程干扰其执行:所需要的只是另一段代码未被完全相同的锁覆盖。例如,
int i;
synchronized void sync_method() {
i = 0;
System.out.println(i);
}
void nonsync_method() {
i = 42;
}
对sync_method()
的调用可以同时打印0和42。
答案 1 :(得分:1)
您应该注意到two types of synchronized block in Java(对象同步和类同步)。有两种同步方法(静态和非静态方法)及其等效的同步块(分别为类和对象同步块)。 假设我们有:
class MyClass{
public synchronized static void syncStaticMethod(){...}
public synchronized void syncNonStaticMethod(){...}
}
MyClass objRef = new MyClass();
<强> 1。对象同步:
public void method() {synchronized(objRef) { ... }}
相当于
public void method() {objRef.syncNonStaticMethod();}
<强> 2。类同步:
public void method() {synchronized(MyClass.class) { ... }}
相当于
public void method() {MyClass.syncStaticMethod();}