synchronized(this) 和 synchronized(some other object) 之间有什么区别?

9 浏览
0 Comments

synchronized(this) 和 synchronized(some other object) 之间有什么区别?

在上面的代码中,doStuffapproach1、doStuffapproach2和doStuffapproach3这些方法实现了相同类型的块同步吗?如果不是,它们之间有什么区别?在什么场景下应该使用它们?

是的,这三种方法都实现了块同步,但它们使用了不同的锁对象。

doStuffapproach1使用了当前实例(this)作为锁对象,它在同一时间只允许一个线程进入同步块执行操作。

doStuffapproach2使用了一个私有成员变量memberlockObject作为锁对象,它在同一时间只允许一个线程进入同步块执行操作。与doStuffapproach1不同的是,使用了一个特定的对象作为锁,而不是this。

doStuffapproach3使用了一个参数传递的锁对象作为锁,它在同一时间只允许一个线程进入同步块执行操作。与doStuffapproach2不同的是,锁对象是通过参数传递的,可以使用不同的对象作为锁。

在使用这些方法时,应根据具体的需求和场景来选择合适的方法。如果需要在同一实例上进行同步,可以使用doStuffapproach1;如果需要在不同的实例上进行同步,可以使用doStuffapproach2;如果需要在不同的对象上进行同步,可以使用doStuffapproach3。

0
0 Comments

当你使用synchronized关键字时,你需要定义一个对象作为监视器。

synchronized(this)使用当前对象作为监视器

synchronized(otherObject)使用另一个对象作为监视器

如果你需要在不同的类中同步使用同一个对象,至少其中一个需要在this之外同步。

需要注意的是,如果将一个方法定义为synchronized,它会隐式地在this上同步(如果该方法不是静态的)。

doStuffapproach1方法使用this作为监视器,因此对同一对象的该方法的任何调用都是同步的。

doStuffapproach2与doStuffapproach1完全相同,因为你锁定了一个在当前对象中具有唯一实例的对象。

doStuffapproach3的工作方式不同,因为它传递了监视器,并且取决于你传递的参数。

0