Pytam tylko z perspektywy wątków ... prawdopodobnie wiele razy odpowiadałem, ale proszę, pomóż mi to zrozumieć.Zmienna statyczna kontra volatile
Nawiązując do posta tutaj Volatile Vs Static in java
prosząc statyczną wartość zmiennej jest również będzie jedna wartość dla wszystkich wątków, to dlaczego mamy iść za niestabilne? Znalazłem następujący przykład:
public class VolatileExample {
public static void main(String args[]) {
new ExampleThread("Thread 1 ").start();
new ExampleThread("Thread 2 ").start();
}
}
class ExampleThread extends Thread {
private static volatile int testValue = 1;
public ExampleThread(String str){
super(str);
}
public void run() {
for (int i = 0; i < 3; i++) {
try {
System.out.println(getName() + " : "+i);
if (getName().compareTo("Thread 1 ") == 0)
{
testValue++;
System.out.println("Test Value T1: " + testValue);
}
if (getName().compareTo("Thread 2 ") == 0)
{
System.out.println("Test Value T2: " + testValue);
}
Thread.sleep(1000);
} catch (InterruptedException exception) {
exception.printStackTrace();
}
}
}
}
wyjściowa:
Thread 1 : 0
Test Value T1: 2
Thread 2 : 0
Test Value T2: 2
Thread 1 : 1
Test Value T1: 3
Thread 2 : 1
Test Value T2: 3
Thread 1 : 2
Test Value T1: 4
Thread 2 : 2
Test Value T2: 4
Jeśli usunąć statyczne z testValue, uzyskany wynik:
Thread 1 : 0
Test Value T1: 2
Thread 2 : 0
Test Value T2: 1
Thread 1 : 1
Test Value T1: 3
Thread 2 : 1
Test Value T2: 1
Thread 1 : 2
Test Value T1: 4
Thread 2 : 2
Test Value T2: 1
Dlaczego nić 2 nie czyta zaktualizowaną wartość? Jeśli to musi być zrobione statycznie, jak używać niestabilnego?
Czy ktoś może podać link do dobrego przykładu zmiennej, w której ta zmienna nie jest statyczna.
Dzięki
Przyjęty odpowiedź na post, który łączyłeś, aby odpowiedzieć na twoje pytanie. –
Przeczytaj resztę odpowiedzi - szczególnie. bit o wartości ** static volatile ** .. – Nim
'static' =/=' final'. –