Java中两个同步块的区别

时间:2012-05-19 12:19:35

标签: java synchronization

假设我有一个类Employee,我将该类的对象创建为

Employee emp = new Employee();

以下两个同步块之间有什么区别

synchronized(emp){ } and
synchronized(Employee.class)

3 个答案:

答案 0 :(得分:8)

第一个使用一个Employee实例作为监视器。第二个使用 Employee类作为监视器。

如果目标是保护员工的实例变量,那么第一个变量比第二个变量更有意义。如果目标是保护Employee类的静态变量,那么第二个是有道理的,但不是第一个。

答案 1 :(得分:1)

第一个在类的特定实例上同步。因此,如果你有2个线程在类的两个不同实例上运行,它们都可以同时进入块 - 当然是在它们自己的上下文中。

第二个块在类本身上同步。因此,即使您有两个具有两个不同实例的线程,该块也将一次仅由一个线程输入。

答案 2 :(得分:1)

当你进行syncrhonize时,你需要一个对象来定义信号量。当线程A位于由对象A定义的同步块内时,其他线程不能位于对象A定义的其他此类块中,但它可以位于由其他对象定义的任何其他同步块内。

empEmployee.class是不同的对象,因此两个同步的块不是不兼容的(你可以在第一个内部有一个线程,在第二个内部有另一个)。

在更一般的说明中,您应该使用第一个块来保护仅影响单个员工对象的敏感代码,并且第二个块用于更改一个员工可能影响其他员工关键部分或集合/聚合值的操作中的第二个块他们