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通过从块执行中删除一些操作来进行优化.
同步方法是简写.这个:
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块,你能具体谈谈你的锁,更精致,当你要使用它,但除此之外,没有任何区别.