假设我有一个类Employee,我将该类的对象创建为
Employee emp = new Employee();
以下两个同步块之间有什么区别
synchronized(emp){ } and
synchronized(Employee.class)
答案 0 :(得分:8)
第一个使用一个Employee实例作为监视器。第二个使用 Employee类作为监视器。
如果目标是保护员工的实例变量,那么第一个变量比第二个变量更有意义。如果目标是保护Employee类的静态变量,那么第二个是有道理的,但不是第一个。
答案 1 :(得分:1)
第一个在类的特定实例上同步。因此,如果你有2个线程在类的两个不同实例上运行,它们都可以同时进入块 - 当然是在它们自己的上下文中。
第二个块在类本身上同步。因此,即使您有两个具有两个不同实例的线程,该块也将一次仅由一个线程输入。
答案 2 :(得分:1)
当你进行syncrhonize时,你需要一个对象来定义信号量。当线程A位于由对象A定义的同步块内时,其他线程不能位于对象A定义的其他此类块中,但它可以位于由其他对象定义的任何其他同步块内。
emp
和Employee.class
是不同的对象,因此两个同步的块不是不兼容的(你可以在第一个内部有一个线程,在第二个内部有另一个)。
在更一般的说明中,您应该使用第一个块来保护仅影响单个员工对象的敏感代码,并且第二个块用于更改一个员工可能影响其他员工关键部分或集合/聚合值的操作中的第二个块他们