絕對 - 畢竟,它的訪問共享資源,可能通過多線程。我個人只是使用AtomicInteger
來代替。
public class MyClass {
private static final AtomicInteger count = new AtomicInteger();
public MyClass() {
count.incrementAndGet();
}
}
注意,我們現在可以把這些變量最終爲變量不改變價值,我們並不需要同步任何更多的爲java.util.concurrent.atomic類的整點是,他們可以無需額外的同步就可以自動使用。
即使你是在您需要同步的情況下,我不會用MyClass.class
這樣做 - 這就是它的其他代碼可能會決定要同步的一個參考,所以你不能真正原因有關代碼更多。我會寫(同樣,只AtomicInteger
是不是出於某種原因不夠好):
public class MyClass {
private static final Object countLock = new Object();
private static int count = 0;
public MyClass() {
synchronized(countLock) {
count++;
}
...
}
}
(在這種情況下,你想也想在countLock
其他地方同步訪問count
,甚至只是爲了讀書。 )
你知道靜態的,可變的變量是代碼味道,對嗎? – 2012-03-01 19:58:29
@LouisWasserman,我沒有意識到他們被認爲是一種氣味,但我現在就做。謝謝。 – 2012-03-01 20:06:41
[這裏](http://code.google.com/p/google-singleton-detector/wiki/WhySingletonsAreControversial)是一個可能解釋_why_他們是代碼味道的引用。它着重於單例 - 這是靜態的一個特例 - 但這個問題更普遍適用。 – 2012-03-01 20:23:37