0

Ich habe eine Methode, die jede Minute von einem Scheduler aufgerufen wird, um eine Datei von ftp zu erhalten, verarbeitet und persistent ihre Datensätze in einem DB. Ich brauche dieses Themas sicher zu machen, so dass, wenn das Verfahren mehrere Dateien auf einmal zu erfüllen hat, ist es eine wirkt in einem Thread sichere Art und Weise ..Erstellen einer geplanten Methode Thread sicher

public synchronized void processData(String data){ 
    //do processing 
} 

ist dies wirklich ein Thread sichere Methode sein würde, die behandelt hohe Ladevolumen anmutig?

+0

in meinem Szenario, stellen Sie sich vor, der Scheduler wird um 11:00 Uhr aufgerufen, die 1000 Dateien in der ProcessData-Methode verarbeitet wird. Der Scheduler ist so konfiguriert, dass er alle 1 Minute startet und in 11:01 erneut aufgerufen wird. Die Verarbeitung der ersten 1000 Dateien ist jedoch nicht abgeschlossen. Was wird der beste Weg sein, dieses Szenario anzugehen? 1. Synchronisiertes Schlüsselwort in Methode eliminieren 2.Starten Sie einen neuen Thread für jeden Dateiprozess ? – Sanath

Antwort

3

Es ist threadsicher, solange es keine Stateful-Felder des umschließenden Objekts verwendet.

Mit anderen Worten, wenn es ein Feld auf Klassenebene gibt, das manipuliert oder in processData(String data) mit der Absicht zugegriffen wird, um zu verfolgen, was vor sich geht, dann ist es nicht Thread-sicher.

Ein Beispiel könnte ein Feld auf Klassenebene mit dem Namen private Boolean hasConnection; sein. Wenn Sie überprüfen müssen, ob eine Verbindung mit diesem Feld besteht oder nicht, haben Sie keine Thread-sichere Methode. Wenn Sie diese Anforderung erfüllen, müssen Sie das Schlüsselwort synchronized nicht einmal zu Ihrer Methode hinzufügen. Es wird standardmäßig threadsicher sein, und eine unbegrenzte Anzahl von Threads kann gleichzeitig darauf zugreifen.

Wenn Sie diese Anforderung nicht erfüllen, müssen Sie die gesamte Klasse posten, um festzustellen, ob sie threadsicher ist oder nicht.

+1

Wird auf der Methodenebene nicht mit der Objektinstanz für eine Sperre synchronisiert? Das bedeutet, dass alle Felder auf Instanzebene geschützt sind ... – rfeak

+0

@rfeak sie sind nicht unbedingt geschützt. Wenn sie öffentlich sind, sind sie definitiv nicht geschützt. Wenn sie "privat" sind, aber auf nicht "synchronisierte" Methoden zugreifen, sind sie auch nicht geschützt. –

+0

Ich denke, geschützt ist der falsche Weg, es zu sagen. Synchronisiert mit der Methode verwendet das Objekt für die Sperre.Das bedeutet, dass auf die Variablen in der Objektinstanz nicht gleichzeitig von mehreren Threads zugegriffen werden kann, für die THAT-Methode (oder eine andere Methode, die in dieser Klasse als synchronisiert gekennzeichnet ist). Mein Punkt ist, dass Sie Instanzvariablen innerhalb dieser Methode verwenden können, solange Sie andere synchronisierte Methoden markieren, die den Status ändern könnten. – rfeak

2

Angenommen, die mysteriöse Operation "Datei verarbeiten" ist eigenständig, die größte Sache, um die Sie sich kümmern sollten, ist Ihre DB-Verbindung: Machen Sie sie nicht gemeinsam, holen Sie jedes Mal eine neue aus einer Verbindungszeichenfolge und verwenden Sie sie a connection pool. Machen Sie Ihre Methode nicht synchron, es sei denn, Sie müssen innerhalb Ihrer Klasse auf den gemeinsamen Status zugreifen. Andernfalls wäre Ihre Methode nicht in der Lage, mehrere Threads gleichzeitig auszuführen.

1

Bitte beschreiben Sie uns, welche Ressourcen Ihre Methode verwendet und welche dieser Ressourcen gemeinsam genutzt werden.

Wenn Sie kein allgemeines Objekt verwenden, gibt es kein Problem.

Wenn Sie allgemeine Ressourcen verwenden, müssen Sie sicherstellen, dass auf diese Ressourcen threadsicher zugegriffen werden kann oder nicht auf mehrere Threads zugegriffen wird.

Ihre Frage ist über die Leistung. Im Allgemeinen scheint processData eine Methode zu sein, die einige Zeit dauern wird: Sie verwenden Datenbanken. Die Zeit, die erforderlich ist, um eine Sperre zu erhalten, ist im Vergleich zu einer DB-Abfrage minimal. Also nein, das Keyword synchronized wird Ihnen keine spürbaren Auswirkungen auf die Leistung geben.