Java 中同步块的简化
Simplification of synchronized block in Java
我在理解 Java 中同步块的概念时遇到了一些麻烦。我觉得我已经足够了解同步方法了。所以我想到了一个类比来帮助我从同步方法的角度来理解同步块。请让我知道我提出的这个等效性是否正确。另外,我现在只针对非静态同步块提到了这一点。但是,也欢迎对静态同步块的点数。
public void method()
{
//code snipppet A
synchronized(objRef)
{
//code snipppet B
}
//code snipppet C
}
相当于
public void method() {
//code snippet A
objRef.sync_method();
//code snippet C
}
在 objRef 的 class 中:
public synchronized void sync_method() {
//code snippet B
}
这个类比是基于同步块的行为与同步方法一样的逻辑。这意味着一旦一个线程获得了监视器上的锁,它就不允许其他线程干扰它的执行。只有在执行完整个同步方法后,线程才会放弃控制权。
您应该注意到有 two types of synchronized block in Java(对象同步和 class 同步)。有两种同步方法(静态和非静态方法)及其等效的同步块(分别为 Class 和 Object Synchronized 块)。
假设我们有:
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。 Class同步:
public void method() {synchronized(MyClass.class) { ... }}
相当于
public void method() {MyClass.syncStaticMethod();}
您可能没有把所有事情都做对。例如,
synchronized(objRef) {
objRef.nonsync_method();
... more code ...
}
不等同于
objRef.sync_method();
因为在前一种情况下,锁覆盖了大部分代码。
之间存在等价关系
synchronized void sync_method() {
// stuff
}
和
void nonsync_method() {
synchronized (this) {
// stuff
}
}
此外,
once a thread acquires a lock on the monitor, it does not allow other threads to interfere in its execution
以上说法可能正确也可能不正确,这取决于我们如何解释模棱两可的措辞。获得锁的线程可能很容易让其他线程干扰它的执行:它所需要的只是另一段没有被完全相同的锁覆盖的代码。例如,
int i;
synchronized void sync_method() {
i = 0;
System.out.println(i);
}
void nonsync_method() {
i = 42;
}
调用sync_method()
可以同时打印0和42。
我在理解 Java 中同步块的概念时遇到了一些麻烦。我觉得我已经足够了解同步方法了。所以我想到了一个类比来帮助我从同步方法的角度来理解同步块。请让我知道我提出的这个等效性是否正确。另外,我现在只针对非静态同步块提到了这一点。但是,也欢迎对静态同步块的点数。
public void method()
{
//code snipppet A
synchronized(objRef)
{
//code snipppet B
}
//code snipppet C
}
相当于
public void method() {
//code snippet A
objRef.sync_method();
//code snippet C
}
在 objRef 的 class 中:
public synchronized void sync_method() {
//code snippet B
}
这个类比是基于同步块的行为与同步方法一样的逻辑。这意味着一旦一个线程获得了监视器上的锁,它就不允许其他线程干扰它的执行。只有在执行完整个同步方法后,线程才会放弃控制权。
您应该注意到有 two types of synchronized block in Java(对象同步和 class 同步)。有两种同步方法(静态和非静态方法)及其等效的同步块(分别为 Class 和 Object Synchronized 块)。 假设我们有:
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。 Class同步:
public void method() {synchronized(MyClass.class) { ... }}
相当于
public void method() {MyClass.syncStaticMethod();}
您可能没有把所有事情都做对。例如,
synchronized(objRef) {
objRef.nonsync_method();
... more code ...
}
不等同于
objRef.sync_method();
因为在前一种情况下,锁覆盖了大部分代码。
之间存在等价关系synchronized void sync_method() {
// stuff
}
和
void nonsync_method() {
synchronized (this) {
// stuff
}
}
此外,
once a thread acquires a lock on the monitor, it does not allow other threads to interfere in its execution
以上说法可能正确也可能不正确,这取决于我们如何解释模棱两可的措辞。获得锁的线程可能很容易让其他线程干扰它的执行:它所需要的只是另一段没有被完全相同的锁覆盖的代码。例如,
int i;
synchronized void sync_method() {
i = 0;
System.out.println(i);
}
void nonsync_method() {
i = 42;
}
调用sync_method()
可以同时打印0和42。