3 Stimmen

Veranschaulichung der Flüchtigkeit: Ist dieser Code thread-sicher?

Ich versuche, die Verwendung und Bedeutung von volatile mit einem Beispiel, das nicht wirklich zu einem guten Ergebnis führen würde, wenn volatile wurde ausgelassen.

Aber ich bin es nicht wirklich gewohnt, mit volatile . Die Idee des folgenden Codes ist es, eine Endlosschleife auszulösen, wenn volatile weggelassen wird, und vollkommen thread-sicher ist, wenn volatile vorhanden ist. Ist der folgende Code thread-sicher? Haben Sie ein anderes realistisches und kurzes Beispiel für Code, der volatile und würde ohne sie ein offensichtlich falsches Ergebnis liefern?

Hier ist der Code:

public class VolatileTest implements Runnable {

    private int count;
    private volatile boolean stopped;

    @Override
    public void run() {
        while (!stopped) {
            count++;
        }
        System.out.println("Count 1 = " + count);
    }

    public void stopCounting() {
        stopped = true;
    }

    public int getCount() {
        if (!stopped) {
            throw new IllegalStateException("not stopped yet.");
        }
        return count;
    }

    public static void main(String[] args) throws InterruptedException {
        VolatileTest vt = new VolatileTest();
        Thread t = new Thread(vt);
        t.start();
        Thread.sleep(1000L);
        vt.stopCounting();
        System.out.println("Count 2 = " + vt.getCount());
    }
}

0voto

Falscher Code, bei dem wir x = 1 auch dann nicht annehmen können, wenn y bereits 2 ist:

Class Reordering {
  int x = 0, y = 0;
  public void writer() {
    x = 1;
    y = 2;
  }

  public void reader() {
    int r1 = y;
    int r2 = x;
  }
}

Beispiel für die Verwendung des Schlüsselworts volatile:

class VolatileExample {
  int x = 0;
  volatile boolean v = false;
  public void writer() {
    x = 42;
    v = true;
  }

  public void reader() {
    if (v == true) {
      //uses x - guaranteed to see 42.
    }
  }
}

Fuente: http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X