Es ist besser, einen synchronisierten block in einem try-block oder einem try-block in einen synchronized block?
Zum Beispiel, ist das besser?
try {
synchronized (bean) {
//Write something
}
} catch (InterruptedException e) {
//Write something
}
Oder ist es besser diese:
synchronized (bean) {
try {
//Write something
}
catch (InterruptedException e) {
//Write something
}
}
Ich Frage mich, welche ist die beste Praxis. Offensichtlich bedenkt, dass ich synchronisieren, den code innerhalb des try-Blocks. Ich Rede nicht über den Fall habe ich zum synchronisieren nur ein Teil der code innerhalb des try - (in diesem Fall ich denke, es wäre besser, den synch-block in der try). Meine Zweifel über dem Fall, wo ich habe, um die Synchronisierung aller try-block.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sofern Sie nicht explizit benötigen die
catch
imsynchronized
block, würde ich das machensynchronized
code-Abschnitt, der so klein wie möglich und haben es innerhalb des try - /catch. Also das erste Muster wäre besser. Dann, wenn Sie brauchen, um Operationen in dercatch
Abschnitt (wie die Anmeldung der Ausnahme oder re-interrupt der thread, siehe unten), diese würde nicht blockieren andere threads.Sagte, dass, wenn die
synchronized
- block enthält eine Anzahl von Zeilen (in der Regel nicht eine gute Idee, natürlich), dann würde ich in Erwägung ziehen die try/catch-block näher auf die Methode wirft die Ausnahme (prollywait
odernotify
). Mit einer großen Anzahl von Linien, die Sie ausführen, das Risiko von unsachgemäßer Behandlung von Ausnahmen mit großen try/catch-Blöcke. Hängt auch ein wenig vom Bezugssystem hier.Als ein beiseite, stellen Sie sicher, dass Sie mindestens log unterbrochen Ausnahmen. Nie ignorieren Sie Sie einfach. Sie wahrscheinlich auch wollen, um re-interrupt-thread:
Then if you do need to do operations in the catch section...these wouldn't block other threads.
Wäre, warum geben wir das Schloss durch eine Ausnahme?catch
block @Cratylus.Es gibt keine best-practice. Es hängt nur, wenn Sie das exception-handling Teil innerhalb der synchronized-block oder nicht. Möchten Sie vielleicht eins oder das andere, und sollte das wählen, das lässt den synchronisierten block, den kürzesten, und trotzdem macht der code korrekt und thread-safe.
Du scheinst zu denken, das ist nur eine ästhetische Frage. Das ist es nicht. Es ist eine funktionale Frage-und die Antwort wird diktiert durch die Notwendigkeit in jedem einzelnen Fall. Jeder synchronized-block sollte so groß wie nötig enthalten, was synchronisiert werden muss, und nicht größer.
Ist es egal, ob Ihr catch-block synchronisiert? Da hast du "etwas schreiben" da ich annehme, dass Sie tun werden einige der Protokollierung welche nicht synchronisiert werden müssen mit eine gute logging-framework, was bedeuten würde, die Antwort ist wahrscheinlich keine.
Im Allgemeinen Ihr Ziel sollte sein, so wenig Synchronisation wie möglich. Die kleineren für die Synchronisierung blockieren, die weniger wahrscheinlich sind, laufen in Probleme.
In diesem Fall
InterruptedException
passieren könnte, nur innerhalb dersynchronized
block, wo Sie konnten entweder rufenwait
odersleep
odernotify
.Im Allgemeinen die beste Methode besteht darin, den
try/catch
block so nah an den code, könnte eine exception werfen, so dass es einfach ist, um den code identifizieren und zu beheben.Es hat nichts zu tun mit
synchronized{try{}}
odertry{synchronized{}}
, aber alles zu tun mitsynchronized{catch{}}
odersynchronized{} catch{}
. Es hängt wirklich davon ab, was man in den catch-block.Allerdings eine Vermutung, für
InterruptedException
Sie in der Regel tun solltencatch{}
außerhalbsynchronized{}
.