Sab*_*thy 56 java multithreading synchronization
我已经开始在线程中学习同步.
同步方法:
public class Counter {
private static int count = 0;
public static synchronized int getCount() {
return count;
}
public synchronized setCount(int count) {
this.count = count;
}
}
Run Code Online (Sandbox Code Playgroud)
同步块:
public class Singleton {
private static volatile Singleton _instance;
public static Singleton getInstance() {
if (_instance == null) {
synchronized(Singleton.class) {
if (_instance == null)
_instance = new Singleton();
}
}
return _instance;
}
}
Run Code Online (Sandbox Code Playgroud)
我什么时候应该使用Synchronized方法和Synchronized块?为什么Synchronized阻止比同步方法更好?
Eri*_*son 72
这不是更好,只是不同的问题.
同步方法时,您实际上正在同步对象本身.对于静态方法,您将同步到对象的类.所以以下两段代码执行相同的方式:
public synchronized int getCount() {
// ...
}
Run Code Online (Sandbox Code Playgroud)
这跟你写的一样.
public int getCount() {
synchronized (this) {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
如果要控制与特定对象的同步,或者只希望将某个方法的一部分同步到该对象,则指定一个synchronized
块.如果synchronized
在方法声明中使用关键字,它将使整个方法与对象或类同步.
wol*_*tle 37
虽然通常不是一个问题,但从安全角度来看,最好在私有对象上使用synchronized,而不是将其放在方法上.
将它放在方法上意味着您正在使用对象本身的锁来提供线程安全性.使用这种机制,您的代码的恶意用户也可能获得对象的锁定,并永久保留它,有效地阻止其他线程.非恶意用户可以无意中有效地做同样的事情.
如果使用私有数据成员的锁定,则可以防止这种情况,因为恶意用户无法获取私有对象的锁定.
private final Object lockObject = new Object();
public void getCount() {
synchronized( lockObject ) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
Bloch的Effective Java(第2版),第70项中提到了这种技术
Ang*_*ity 28
区别在于获取锁定:
synchronized方法获取整个对象的锁定.这意味着当该方法由一个线程运行时,没有其他线程可以在整个对象中使用任何同步方法.
synchronized块在synchronized关键字之后获取括号内对象的锁定.意味着在同步块退出之前,没有其他线程可以获取锁定对象的锁定.
因此,如果要锁定整个对象,请使用synchronized方法.如果要将对象的其他部分保持为其他线程可访问,请使用synchronized块.
如果仔细选择锁定对象,则同步块将导致争用较少,因为整个对象/类未被阻止.
这类似于静态方法:同步静态方法将获取整个类对象中的锁,而静态方法中的同步块将在括号内的对象中获取锁.
同步块和同步方法之间的区别如下:
同步块:
synchronized(this){}
同步方法:
public synchronized void fun(){}
归档时间: |
|
查看次数: |
86216 次 |
最近记录: |