问题
class ThreadSafeClass extends Thread
{
private static int count = 0;
public synchronized static void increment()
{
count++;
}
public synchronized void decrement()
{
count--;
}
}
谁能解释为什么上面的类不是线程安全的?
#1 热门回答(132 赞)
由于increment
方法是static
it将在ThreadSafeClass
的类对象上同步。 Thedecrement
方法不是静态的,将在用于调用它的实例上进行同步。即,它们将在不同的对象上同步,因此两个不同的线程可以同时执行这些方法。由于++
和--
操作不是原子的,因此类不是线程安全的。
此外,自count
isstatic
,从decrement
修改它是一个synchronizedinstance方法是不安全的,因为它可以在不同的实例上调用并同时修改count
。
#2 热门回答(23 赞)
你有两个同步方法,但其中一个是静态的,另一个不是。访问同步方法时,根据其类型(静态或非静态),将锁定另一个对象。对于静态方法,锁定将放在Class对象上,而对于非静态块,锁定将放在运行该方法的类的实例上。因为你有两个不同的锁定对象,所以可以有两个线程同时修改同一个对象。
#3 热门回答(14 赞)
有谁可以解释为什么上面的类不是线程安全的?
- 增量为静态,同步将在类本身上完成。
- 递减不是静态的,将在对象实例化上进行同步,但由于count是静态的,因此不会保护任何内容。
我想补充一点来声明一个线程安全的计数器,我相信最简单的方法是使用AtomicInteger
而不是原始的int。
让我将你重定向到java.util.concurrent.atomic
package-info。