Java中的synchronized方法和synchronized块之间有什么区别?

Gee*_*eek 36 java multithreading synchronization synchronized synchronized-block

Java中的synchronized方法和synchronized块之间有什么区别?

我一直在网上搜索答案,人们似乎对这一个如此不确定:-(

我的看法是两者之间没有区别,除了同步块可能在范围内更加局部化,因此锁定的时间会更短?

如果是静态方法上的Lock,那么Lock是什么?锁定类的含义是什么?

not*_*oop 45

synchronized方法使用方法receiver作为锁(即this非静态方法,静态方法的封闭类). Synchronized块使用表达式作为锁.

因此,以下两种方法与锁定前瞻性相当:

synchronized void mymethod() { ... }

void mymethod() {
  synchronized (this) { ... }
}
Run Code Online (Sandbox Code Playgroud)

对于静态方法,该类将被锁定:

class MyClass {
  synchronized static mystatic() { ... }

  static mystaticeq() {
    syncrhonized (MyClass.class) { ... }
  }
}
Run Code Online (Sandbox Code Playgroud)

对于synchronized块,您可以将任何非null对象用作锁:

synchronized (mymap) {
  mymap.put(..., ...);
}
Run Code Online (Sandbox Code Playgroud)

锁定范围

用于同步的方法中,锁将整个方法范围,而在所保持的,synchronized块,锁只是块范围(也称为临界区)期间保持.实际上,如果JVM synchronized可以证明它可以安全地完成,则允许JVM通过从块执行中删除一些操作来进行优化.

  • @Gregory Mostizky根据这篇文章,与同步块相比,JVM为同步方法创建的字节码更少.http://www.ibm.com/developerworks/java/library/j-5things15/index.html?ca=drs- (2认同)

jqn*_*qno 8

同步方法是简写.这个:

class Something {
    public synchronized void doSomething() {
        ...
    }

    public static synchronized void doSomethingStatic() {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

就所有意图和目的而言,等同于:

class Something {
    public void doSomething() {
        synchronized(this) {
            ...
        }
    }

    public static void doSomethingStatic() {
        synchronized(Something.class) {
            ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

(Something.class该类的类对象在哪里Something.)

因此,我们确实,用synchronized块,你能具体谈谈你的锁,更精致,当你要使用它,但除此之外,没有任何区别.


Hen*_*ing 5

是的,这是一个区别。另一个是您可以获取除 之外的其他对象上的锁this