2012-03-28 15 views
3

Ich möchte durch eine statische Factory-Methode, ein Objekt erhalten, wieJava: statische Factory-Methode und die Threadsicherheit

Person p = Person.fromName("Jack"); 

class Person { 
    public static Person fromName(String name){ 
     return new Person(name); 
    } 
} 

aber fromname() -Methode nicht sicher ist, fädeln, (fromname() ist nur ein Beispiel , diese Art von Methode wird Fehler auftreten, wenn es in meinem Programm ausgeführt wird) jedoch ist es ineffizient, wenn diese Methode synchronisiert wird, da mehrere Threads diese Methode gleichzeitig aufrufen sollten. Gibt es einen Vorschlag, es zu beheben?

+0

tun Sie wollen also eine ObjectPool, welche die gleiche Person-Instanz für die zurück gleicher Vorname? Ansonsten sollte es überhaupt kein Problem geben. – synopia

+0

Sie möchten Thread sicher machen und mehreren Threads gleichzeitig Zugriff gewähren. –

+0

@ChandraSekhar Ja, das ist was ich will – remy

Antwort

1

Ihr Problem unlösbar scheint, wenn Sie sagen, dass

    A) das Verfahren nicht sicher ist Thread (also Bedürfnisse synchron zu verwenden) und

    B) es kann aus Effizienzgründen nicht synchronisiert werden.

Der einzige Rat ich Ihnen geben kann, ist als feinkörniger syncrhonization wie möglich durchzuführen, das heißt nur synchronisieren über gewinde unsichere Teile des Verfahrens.

Wenn zum Beispiel Anweisung S1 muss atomar zusammen Sie mit S2 durchgeführt werden konnte, anstatt das zu tun

public synchronized static Person fromName(String name){ 
    ... 
    S1; 
    S2; 
    ... 
    return ...; 
} 

public static Person fromName(String name){ 
    ... 
    synchronized (lock) { 
     S1; 
     S2; 
    } 
    ... 
    return ...; 
} 
+0

Vielen Dank, ich weiß, dass ich kann verwende keine statische Factory-Methode ohne synchronisiert, also entscheide ich mich für die Objektmethode anstelle der Klassenmethode. – remy

+1

Sicher können Sie statische Methoden synchronisiert haben. Wer hat dir gesagt, dass du "synchronized" nicht in statischen Methoden verwenden kannst? – aioobe

2

Wenn Sie Code haben, die gleichzeitig in mehreren Threads auszuführen unsicher ist, aber Sie wollen es von mehreren Threads nennen, es klingt wie Sie wirklich nur zwei Möglichkeiten:

  • Make it thread-safe
  • Nehmen Sie den Erfolg von Serialisierung Anrufe via Synchronisation

Sie keine Informationen gegeben haben, die, welche davon am besten geeignet ist in Ihrer Situation vorschlagen würde. (Haben Sie die Performance-Einbußen der Synchronisation gemessen? Haben Sie versucht, es Thread-sicher zu machen?)

+0

Ja, ich habe versucht, es threadsicher zu machen, aber es ist ineffizient, daher entscheide ich mich, die Objektmethode anstelle der Klassenmethode zu verwenden. Vielen Dank – remy

+3

@Remy: Das erklärt wirklich nichts über das, was Sie tun ... es klingt wie Sie haben einige dubiose Überzeugungen über was Thread Sicherheit beinhaltet ... –

Verwandte Themen