问题

class ThreadSafeClass extends Thread
{
     private static int count = 0;

     public synchronized static void increment()
     {
         count++;
     }

     public synchronized void decrement()
     {
         count--;
     }
}

谁能解释为什么上面的类不是线程安全的?


#1 热门回答(132 赞)

由于increment方法是staticit将在ThreadSafeClass的类对象上同步。 Thedecrement方法不是静态的,将在用于调用它的实例上进行同步。即,它们将在不同的对象上同步,因此两个不同的线程可以同时执行这些方法。由于++--操作不是原子的,因此类不是线程安全的。

此外,自countisstatic,从decrement修改它是一个synchronizedinstance方法是不安全的,因为它可以在不同的实例上调用并同时修改count


#2 热门回答(23 赞)

你有两个同步方法,但其中一个是静态的,另一个不是。访问同步方法时,根据其类型(静态或非静态),将锁定另一个对象。对于静态方法,锁定将放在Class对象上,而对于非静态块,锁定将放在运行该方法的类的实例上。因为你有两个不同的锁定对象,所以可以有两个线程同时修改同一个对象。


#3 热门回答(14 赞)

有谁可以解释为什么上面的类不是线程安全的?

  • 增量为静态,同步将在类本身上完成。
  • 递减不是静态的,将在对象实例化上进行同步,但由于count是静态的,因此不会保护任何内容。

我想补充一点来声明一个线程安全的计数器,我相信最简单的方法是使用AtomicInteger而不是原始的int。

让我将你重定向到java.util.concurrent.atomicpackage-info。


原文链接