Java 与2个对象同步的块不工作

Java 与2个对象同步的块不工作,java,synchronized,Java,Synchronized,我正在测试一段代码,其中我有两个方法,每个方法中的一条语句都是同步的 private final Object obj1 = new Object(); private final Object obj2 = new Object(); public void method1(int result) { //there's a loop to create delay synchronized (obj1){ sum = sum + result; } //there's a

我正在测试一段代码,其中我有两个方法,每个方法中的一条语句都是同步的

private final Object obj1 = new Object();
private final Object obj2 = new Object();

public void method1(int result)
{
 //there's a loop to create delay

 synchronized (obj1){
   sum = sum + result;
 }

 //there's a loop to create delay

}


public void method2(int result)
{
  //there's a loop to create delay

 synchronized (obj2){
   sum = sum - result;
 }

 //there's a loop to create delay

}
我基本上做的是把结果加到总和上,然后减去相同的量,然后打印总和。所以我的初始值和最终值应该是恒定的

问题是,当我使用2个diff对象作为锁时,我不知道为什么最终数量与初始数量不同。但是,当我使用'this'对象作为两个语句的锁时,它是常量。但使用“this”作为对象并没有使执行时间比使用同步方法更快


我还不熟悉同步概念,因此非常感谢您的帮助。

如果您想同步
上的操作,则两个
同步的
块应该位于同一个对象上(或者
obj1
(或者)
obj2

否则,每个线程获得一个对象上的锁,它们可以同时执行操作


每个线程在执行任何受保护的代码之前都会获得对象上的锁
T1
可能同时获得
Obj1
的锁,
T2
可能同时获得
Obj2
的锁并继续执行,这可能会产生不一致的结果。

同步
块中指定对象时,该对象被用作该块的锁:在任何时候,只有一个
synchronize
块可以使用锁对象

当您使用两个不同的对象作为锁时,它们将成为两个不同的锁:两个线程可以同时锁定它们-每个锁一个线程。这解释了不一致的结果:两个线程可以同时获取两个单独的锁,并同时修改
sum
,从而导致错误的计算


您应该使用单个锁来保护单个资源不受并发访问。这就是使用此
时发生的情况;如果在两个
synchronize
块中都使用
obj1
obj2
,也会发生同样的情况,除非在这种情况下,对象的用户无法通过在对象上同步而使方法永远阻塞,故意不释放锁。

您能解释一下为什么在这种情况下,方法和块同步之间的时间差不明显吗?(我也没有否决投票)另外,使用内部对象来锁定而不是使用
的优点是它无法从外部获取,这会阻止操作。(我不是落选者)@dasblinkenlight,我显然是落选者。我不知道为什么,因为我实际上对答案投了更高的票。请编辑您的答案,以便我可以更正。@user977151我有点失去了上下文:您能否澄清您的“此案例”指的是哪种情况,两个单独的锁,还是一个锁?@user977151同步方法和只包含此
上同步的块的方法没有区别,因为它们是相同的。