静态变量的线程安全性

2022-09-03 00:40:38
class ABC implements Runnable {
    private static int a;
    private static int b;
    public void run() {
    }
}

我有一个如上所述的Java类。我有多个此类线程。在该方法中,变量和每个变量都递增几次。在每次增量时,我都会将这些变量放在哈希表中。run()ab

因此,每个线程将递增两个变量,并将它们放在 Hashtable 中。如何使这些操作线程安全?


答案 1

我会使用AtomicInteger,它被设计为线程安全,并且非常易于使用,并且将绝对最小的同步开销传递给应用程序:

class ABC implements Runnable {
    private static AtomicInteger a;
    private static AtomicInteger b;
    public void run() {
        // effectively a++, but no need for explicit synchronization!
        a.incrementAndGet(); 
    }
}

// In some other thread:

int i = ABC.a.intValue(); // thread-safe without explicit synchronization

答案 2

取决于需要线程安全的内容。对于这些基元,您需要将它们替换为 's,或者仅在方法或块中使用它们。如果您需要使跨线程 Hashtable 线程安全,则无需执行任何操作,因为它已经同步。intAtomicIntegersynchronized