2016-04-30 6 views
1

In Delegation Muster werden sollte, wenn ich eine konkrete Klasse und eine Wrapper-Klasse haben:Methode, die in Java in Delegation Muster synchronisiert

class Wrapper { 
    Concrete concrete = new Concrete(); 
    void fn() { 
     concrete.fn(); 
    } 
} 

class Concrete { 
    void fn() { 
     ... 
    } 
} 

Wenn die Methode fn() sollte synchronisiert werden dann, wo soll ich die synchronisierte put Stichwort? Wenn wir davon ausgehen, Concrete::fn() wird nur von Wrapper::fn() aufgerufen werden, ist es wahr, dass jeder Ort ist in Ordnung?

+0

Es hängt von der Ressource ab, die Sie schützen möchten. – saka1029

Antwort

1

Ich sehe mehr möglichen Probleme mit auf Wrapper synchronisiert werden: fn():

  • synchronisiert sollte sparsam verwendet werden: nur die Teile sperren, dass Bedarf synchronisiert werden.

  • sollte der Verriegelungsmechanismus ein Anliegen der konkreten Umsetzung - wenn möglich (Sie eine Implementierung haben können, die synchronisiert werden, müssen nicht)

0

Im Allgemeinen ist die Regel so wenig Logik synchronisieren wenn möglich, also wenn Sie zwischen Concrete.fn() und Wrapper.fn() wählen können, dann sollten Sie Concrete.fn() synchronisieren. Sie sollten auch prüfen, ob Sie die gesamte Methode oder einen kleineren Logikblock innerhalb der Methode synchronisieren müssen.

Auch wenn die Anforderung ist, dass Concrete.fn() immer synchronisiert ist und Sie Wrapper.fn() synchronisieren, muss auch jeder zukünftige Code, der Concrete.fn() aufruft, synchronisiert werden. Wenn Sie Concrete.fn() synchronisieren, haben Sie sichergestellt, dass Sie die Synchronisationsanforderungen für zukünftige Implementierungen nicht vergessen.

Verwandte Themen