Was bedeutet Thread-Safe in Java oder wann rufen wir Thread-Safe auf?

8

Ich verstehe dieses Konzept in keiner Weise.

%Vor%

Das ist meine Klasse SomeName. Was ist Thread hier?

  1. Nennen wir die Klasse als Thread.
  2. Nennen wir diese Klasse als Thread, wenn ein anderes Objekt versucht, auf seine Methode oder Mitglieder zuzugreifen?
  3. Nennen wir diese Klasse als Thread, wenn ein anderes Objekt versucht, auf dieses Objekt zuzugreifen?
  4. Was bedeutet es, wenn wir etwas in Java als Thread-sicher bezeichnen?
theJava 04.09.2011, 20:29
quelle

6 Antworten

9

Fadensicher zu sein heißt, mehrere Probleme zu vermeiden. Der häufigste und wahrscheinlich der schlimmste ist Threadlock. Die alte Analogie ist die Geschichte der Speisephilosophen. Sie sind sehr höflich und werden niemals ihre Essstäbchen ausstrecken, um etwas zu essen, wenn jemand anderes dasselbe tut. Wenn sie alle zur selben Zeit ausgehen, dann hören alle zur gleichen Zeit auf und warten ... und es passiert nie etwas, weil sie alle zu höflich sind, um zuerst zu gehen.

Wenn jemand anders darauf hingewiesen hat, dass Ihre App niemals zusätzliche Threads erstellt, sondern lediglich von einer Hauptmethode ausgeht, gibt es nur einen Thread oder einen "Dining Philosopher", so dass Threadlock nicht auftreten kann. Wenn Sie mehrere Threads verwenden, besteht die einfachste Möglichkeit, Threatlock zu vermeiden, darin, einen "Monitor" zu verwenden, bei dem es sich nur um ein Objekt handelt, das beiseite gelegt wird. In der Tat müssen Ihre Methoden eine "Sperre" auf diesem Monitor vor dem Zugriff auf Threads erhalten, so dass es keine Kollisionen gibt. Sie können jedoch weiterhin Threadlock verwenden, da möglicherweise zwei Objekte versuchen, auf zwei unterschiedliche Threads mit jeweils einem eigenen Monitor zuzugreifen. Objekt A muss auf Objekt B warten, um seine Sperre für das Monitorobjekt 1 aufzuheben; Objekt B muss darauf warten, dass Objekt A seine Sperre für das Monitorobjekt 2 aufhebt. Jetzt sind Sie wieder bei Threadlock.

Kurz gesagt, die Sicherheit von Fäden ist nicht schwer zu verstehen, aber es braucht Zeit, Übung und Erfahrung. Wenn Sie zum ersten Mal eine Multithread-App schreiben, wird in Threadlock ausgeführt. Dann wirst du lernen, und es wird bald ziemlich intuitiv. Der größte Nachteil ist, dass Sie die Multithread-Teile einer App so einfach wie möglich halten müssen. Wenn Sie viele Threads haben, mit vielen Monitoren und Locks, wird es exponentiell schwieriger, sicherzustellen, dass Ihre Philosophen nie einfrieren.

Das Java-Tutorial behandelt das Threading sehr gut. es war die einzige Ressource, die ich jemals brauchte.

    
dnuttle 04.09.2011, 20:42
quelle
4

Vielleicht möchten Sie sich Thread als CPU vorstellen, die den von Ihnen geschriebenen Code ausführt.

Was ist thread?

  

Ein Thread ist ein einzelner sequenzieller Steuerungsfluss innerhalb eines Programms.

Von Java-Nebenläufigkeit in der Praxis :

  

Thread-sichere Klassen kapseln jede benötigte Synchronisation ein   Kunden müssen keine eigenen bereitstellen.

    
Dmitry 04.09.2011 20:33
quelle
3

Sie haben jederzeit "Ausführungspunkte", an denen die JVM Ihren Code ausführt, indem sie Methoden durchläuft und das tut, was Ihr Programm vorschreibt.

Für einfache Programme haben Sie nur eins. Für komplexere Programme können Sie mehrere haben, die normalerweise mit einem neuen Thread (), run oder einem Executor aufgerufen werden.

"Thread-sicher" bezieht sich darauf, dass Ihr Code so geschrieben ist, dass ein Ausführungspunkt den anderen Ausführungspunkt nicht ändern kann. Dies ist normalerweise sehr wünschenswert, da diese Änderungen sehr schwer zu debuggen sind, aber da Sie nur einen haben, gibt es keinen anderen, so dass dies nicht zutrifft.

Threads ist ein fortgeschrittenes Thema, auf das du später noch zurückkommen wirst, aber im Moment denke nur, dass, wenn du mit Threads oder Swing nichts besonderes tust, dies nicht auf dich zutrifft. Es wird später, aber nicht jetzt.

    
quelle
1

Nun, in Ihrem speziellen Beispiel, wenn Ihr Programm läuft, hat es nur 1 Thread.
Der Hauptthread.

    
Cratylus 04.09.2011 20:32
quelle
1

Eine Klasse ist threadsicher, wenn auf ein Objekt dieser Klasse parallel von mehreren Threads (und somit von mehreren CPUs) aus zugegriffen werden kann, ohne dass die Garantien, dass es in einer einzelnen Thread-Art zur Verfügung stehen würde, gebrochen werden.

Sie sollten zuerst darüber lesen, was genau Threads sind, zum Beispiel auf Wikipedia , was es möglicherweise macht dann leichter zu verstehen, die Beziehung zwischen Klassen und Threads und der Begriff der Threadsicherheit.

    
Janick Bernet 04.09.2011 20:34
quelle
1

Jeder Code in Java wird in einem Thread ausgeführt. Standardmäßig gibt es einen "Haupt" -Thread, der Ihre main -Methode aufruft. Der gesamte Code in Ihrem Programm wird im Hauptthread ausgeführt, es sei denn, Sie erstellen einen anderen Thread und starten ihn. Threads beginnen, wenn Sie die Methode Thread.start() explizit aufrufen; Sie können auch implizit starten, wenn Sie eine API aufrufen, die indirekt Thread.start() aufruft. (API-Aufrufe, die einen Thread starten, werden in der Regel dokumentiert.) Wenn Thread.start() aufgerufen wird, erstellt es einen neuen Ausführungsthread und ruft die run() -Methode des Thread-Objekts auf. Der Thread wird beendet, wenn die Methode run() zurückgegeben wird.

Es gibt andere Möglichkeiten, Threads zu beeinflussen, aber das sind die Grundlagen. Weitere Informationen finden Sie im Java-Concurrency-Lernprogramm .

    
Ted Hopp 04.09.2011 20:36
quelle

Tags und Links