这个问题已经在这里有一个答案:
- 有没有办法使用同步的方法,而不是一个synchronized块的优势呢? 23个回答
什么是Java中的一个synchronized方法和synchronized块之间的区别?
我一直在寻找在网络上的答案,人们似乎是如此不确定这种:-(一个
我采取的是有两个没有什么区别,除了同步块可能在范围上更本地化,从而锁定将是更小的时间?
而在静态方法锁定的情况下,对什么是采取了锁? 什么是类锁的含义是什么?
这个问题已经在这里有一个答案:
什么是Java中的一个synchronized方法和synchronized块之间的区别?
我一直在寻找在网络上的答案,人们似乎是如此不确定这种:-(一个
我采取的是有两个没有什么区别,除了同步块可能在范围上更本地化,从而锁定将是更小的时间?
而在静态方法锁定的情况下,对什么是采取了锁? 什么是类锁的含义是什么?
一个同步方法使用该方法接收器作为锁定(即this
对于非静态方法和静态方法封闭类)。 Synchronized
块使用表达式作为锁定。
因此,以下两种方法是从锁定准相当于:
synchronized void mymethod() { ... }
void mymethod() {
synchronized (this) { ... }
}
对于静态方法,类将被锁定:
class MyClass {
synchronized static mystatic() { ... }
static mystaticeq() {
syncrhonized (MyClass.class) { ... }
}
}
对于synchronized块,你可以使用任何非null
对象作为锁:
synchronized (mymap) {
mymap.put(..., ...);
}
锁定范围
用于同步的方法中,锁将整个方法范围,而在所保持的, synchronized
块,锁只是块范围(也称为临界区)期间保持。 在实践中,JVM被允许通过除去一些操作出来的,以优化synchronized
块的执行,如果它可以证明它可以安全地进行。
一个同步方法是简写。 这个:
class Something {
public synchronized void doSomething() {
...
}
public static synchronized void doSomethingStatic() {
...
}
}
是,对于所有意图和目的,等价于:
class Something {
public void doSomething() {
synchronized(this) {
...
}
}
public static void doSomethingStatic() {
synchronized(Something.class) {
...
}
}
}
(凡Something.class
是该类的类对象Something
。)
因此,我们确实,用synchronized块,你能具体谈谈你的锁,更精致,当你要使用它,但除此之外,没有任何区别。
是的,这是一个区别。 另一种是,你可以掌握比其他对象锁定this
。
关键区别是这样的:如果声明的方法将被同步,则该方法的整个身体变得同步; 如果你使用synchronized块,但是,那么你就可以围绕在synchronized块的方法仅仅是“关键部分”,同时使该方法的其余部分出块。
如果整个方法是关键部分的一部分,则有实际上是没有区别。 如果不是的话,那么你应该使用一个synchronized块只是周围的临界区。 你在一个synchronized块具有的语句越多,你得到的,所以你要保留那些最小的少整体并行。
上的对象实例被包含在所述的方法的同步方法的锁。
其中作为同步块可以锁定上的任何对象 - 通常被定义为一个实例变量互斥obect。 这允许更好地控制哪些锁在运行。
我采取的是有两个没有什么区别,除了同步块可能在范围上更本地化,从而锁定将是更小的时间?
是。 你是对的。 不同于synchronized
方法,同步语句必须指定提供的内部锁的对象。
从Java教程例如:
public void addName(String name) {
synchronized(this) {
lastName = name;
nameCount++;
}
nameList.add(name);
}
同步语句也是提高并发细粒度同步有用。 你可以找到以下的用例相同教程页面上很好的例子。
举个例子,类MsLunch
有两个实例字段,C1和C2,那些从来不一起使用。 这些领域的所有更新必须synchronized
,但没有理由阻止C1的更新从进行交错与C2的更新-而这样做的产生不必要的堵塞降低并发性。 相反,使用synchronized方法或以其它方式使用与此相关的锁,我们创建了两个对象仅仅提供锁定 。
而在静态方法锁定的情况下,对什么是采取了锁? 什么是类锁的含义是什么?
在这种情况下,该线程获取用于与类相关联的类对象的固有锁。 因而访问类的静态字段是由一个锁这是从锁为类的任意实例不同的控制。
当你犯了一个方法, 同步 (非static
):
这是不可能的用于两个调用synchronized
相同的对象的方法进行交织。 当一个线程正在执行的对象同步方法,来调用同步方法针对同一对象块(挂起执行),直到第一线程所有其他线程与该对象进行。
如果你犯了一个方法, static synchronized
:
这是不可能的两个调用static synchronized
对同一类的不同对象的方法来交错。 当一个线程正在执行一个static synchronized
为一类的一个对象,即调用所有其他线程方法static synchronized
上的任何块(挂起执行),直到第一线程与该方法的执行进行类对象的方法。
你找到更好的替代品在这个SE问题同步:
避免在Java的synchronized(这)?