我在某处读到various reasons应该避免使用synchronized(this)。然而,我遇到的一些值得尊敬的代码在构造函数中使用了以下内容:
public SomeClass(Context context) {
if (double_checked_lock == null) {
synchronized (SomeClass.class) {
if (double_checked_lock == null) {
// some code here
}
}
}
}synchronized(this)和synchronized(SomeClass.class)之间真的有区别吗?
发布于 2012-01-30 03:52:27
synchronized(this)是在当前对象上同步的,因此每个实例只有一个线程可以访问,但不同的线程可以访问不同的实例。例如,每个线程可以有一个实例。
这通常有助于防止多个线程同时更新一个对象,这可能会产生不一致的状态。
synchronized(SomeClass.class)在当前对象的类上同步(如果愿意,也可以在另一个类上同步),因此一次只有一个线程可以访问该类的任何实例。
这可以用来保护在类的所有实例之间共享的数据(可能是实例缓存或实例总数的计数器),以免进入不一致的状态。
发布于 2012-01-30 03:49:51
每个实例的this都不同。
ClassName.class并非如此。
因此,synchronized(this)将允许多个实例同时运行。
发布于 2012-01-30 03:53:21
synchronized关键字,当应用于类上的class锁时,以及应用于当前对象实例上的this锁时。从Java Language Specification中的8.4.3.6, 'synchronized Methods'一节
同步方法在执行之前获取一个监视器(§17.1)。对于类(静态)方法,使用与该方法的类的class对象相关联的监视器。对于实例方法,将使用与此关联的监视器(调用该方法的对象)。
https://stackoverflow.com/questions/9056190
复制相似问题