Java-Thread-Safe-Zähler
Lerne ich schreiben-thread-safe-Programme und wie bewerten Sie codes, die nicht threadsicher sind.
Einer Klasse wird als thread-sicher, wenn es richtig funktioniert, wenn die Ausführung durch mehrere threads.
Meine Counter.java ist nicht thread-sicher ist, aber die Ausgabe war gedruckt, wie erwartet von 0-9 für alle 3 threads.
Kann jemand erklärt warum? und wie thread-Sicherheit funktioniert?
public class Counter {
private int count = 0;
public void increment() {
count++;
}
public void decrement() {
count--;
}
public void print() {
System.out.println(count);
}
}
public class CountThread extends Thread {
private Counter counter = new Counter();
public CountThread(String name) {
super(name);
}
public void run() {
for (int i=0; i<10; i++) {
System.out.print("Thread " + getName() + " ");
counter.print();
counter.increment();
}
}
}
public class CounterMain {
public static void main(String[] args) {
CountThread threadOne = new CountThread("1");
CountThread threadTwo = new CountThread("2");
CountThread threadThree = new CountThread("3");
threadOne.start();
threadTwo.start();
threadThree.start();
}
}
- Sie sind mit einem anderen Counter-Objekt in jedem thread so, dass ist der Grund, warum sieht man keine thread-Sicherheit Probleme in diesem Fall.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein code läuft wunderbar in Ihre spezifischen test. Das bedeutet nicht, es wird immer funktionieren. Versuchen Sie Durchlaufen ein sehr viel mehr Zeiten, und Sie werden wahrscheinlich beginnen zu sehen, Anomalien.
Ihrem test ist ein bisschen so, wie wenn du getestet, dass eine Brücke unterstützen können 20 LKW bei der Fahrt auf der Brücke mit einem Auto. Ist es nicht etwas demonstrieren. Und die belegen, dass th-code thread-safe " mit einem test, ist fast unmöglich. Nur eine sorgfältige Lektüre und Verständnis für alle möglichen Probleme kann Ihnen garantieren, dass. Ein non-thread-safe-Programm gut funktioniert seit Jahren und habe plötzlich einen Fehler.
Machen, die Sie gegen sicher, verwenden Sie ein AtomicInteger.
EDIT :
Auch, wie bereits von @SpringRush, Sie sind nicht gemeinsam auf einem einzigen Zähler zwischen threads. Jeder thread hat seinen eigenen Zähler. Also dein code ist eigentlich thread-safe ist, aber ich glaube nicht, dass es das tut, was Sie beabsichtigen, es zu tun.
Ihre
Counter
ist nicht geteilt durch die 3 threads statt, jeder thread hat eine einzigartigeCounter
So, dass eigentlich thread-safe. Für jeden CountThread, da gibt es einen Zähler. Um es nicht thread-sicher, ändern die Zähler-variable:
Dann wäre es nicht thread-sicher, da verschiedene threads könnte sein, ändern Sie den Zählerstand bei der gleichen Zeit.
Versuchen Sie es mit diesem:
}