Threadsicherheit

18/02/2010 - 12:29 von Pawel Warmuth | Report spam
Hallo zusammen,

ich habe in meinem Projekt das Singletonmuster inplemetiert um zB Zugriffe
auf die DB nur über eine Instanz zu fahren

Ich habe das ganze Threadsicher ausgelegt (instanzieren)

Nun habe ich wahrscheinlich etwas echt dummes gemacht :
public static dbWriter GetInstance()
{
if(Instance == null)
lock (LOCK)
if (Instance == null)
Instance = new dbWriter();
return Instance;
} OK geht


aber in der selben Klasse

public DBDataContext GetDataContext()
{
return DBContext;
}

Das untere ist nun nicht mehr Threadsicher , logisch
Nun meine Frage : Macht es vll mehr Sinn die Database umzukramen und eine
Businesslogik zu implementieren (atm wird das per Linq2SQL geamcht deswegen
kein Business / Datalayer implementierbar) oder gibt es noch eine Quick and
Dirty Lösung für mein problem.
Mein Vorgànger hat in der Planung glaube ich echt Mist gemacht, ich darf es
nun gradebügeln :/

Grüße
 

Lesen sie die antworten

#1 Immo Landwerth
18/02/2010 - 12:51 | Warnen spam
On 18.02.2010 12:29, Pawel Warmuth wrote:

Ich habe das ganze Threadsicher ausgelegt (instanzieren)

Nun habe ich wahrscheinlich etwas echt dummes gemacht :
public static dbWriter GetInstance()
{
if(Instance == null)
lock (LOCK)
if (Instance == null)
Instance = new dbWriter();
return Instance;
} OK geht



Neben dem double-check-lock Muster gibt es in .NET auch einfach diese
Möglichkeit:

public sealed class Singleton
{
public static readonly Singleton Instance = new Singleton();
...
}

Dass diese Instanziierung Threadsicher ist, wird bereits von der CLR
sichergestellt.

Für die meisten Zwecke ist die Art der Instanziierung sogar lazy, weil
Felder erst initialisiert werden, wenn der Typ geladen wird.

aber in der selben Klasse

public DBDataContext GetDataContext()
{
return DBContext;
}

Das untere ist nun nicht mehr Threadsicher , logisch



Wieso logisch? Du gibst nur einen Wert zurück. Was soll daran nicht
threadsicher sicher?

Nun meine Frage : Macht es vll mehr Sinn die Database umzukramen und
eine Businesslogik zu implementieren (atm wird das per Linq2SQL geamcht
deswegen kein Business / Datalayer implementierbar) oder gibt es noch
eine Quick and Dirty Lösung für mein problem.



Ich glaube Deine Frage nicht verstanden zu haben. Was meinst Du z.B. mit
"Macht es vll mehr Sinn die Database umzukramen und eine Businesslogik
zu implementieren"?

Generell macht es Sinn die Geschàftslogik nicht in der DB, sondern in
einer normalen C# DLL zu implementieren. Nicht so sehr damit man die DB
austauschen kann (das macht ohnehin fast niemand), sondern weil Du im
Allgemeinen nur dort auf alle relevanten Informationen und notwendigen
Technologien zugreifen kannst.

Immo Landwerth

Ähnliche fragen