/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Objekt der kun skal findes en gang i JVM ?~
Fra : smb


Dato : 22-03-01 19:10

Hej

Jeg har følgende problem:

I en applikation der består af 3 lag
Præsentationslag (Servlet, JSP)
Funktionslag (Javaklasser, muligvis senere EJB)
Databaselag (Javaklasser, JNDI navneserver lookup mv)

Jeg har desuden et Objekt som indeholder oplysninger om adgang til den
underliggende DB2 database ( der befinder sig på henholdsvis AS/400, VMS,
WM, NT, OS/2, senere Linux og Windows 2000)

Det objekt vil jeg gerne være fri for at instantiere og læse ind fra disken
hver gang der skal skabes en forbindelse til databasen. Men hvordan gør jeg
det, så det samtidigt er trådsikkert ??

Med venlig hilsen
Simon Møgelvang Bang
Systemkonsulent EDB Gruppen A/S
(Som her udelukkende representerer sig selv, og ikke EDB Gruppen A/S)



 
 
Ulrik Magnusson (22-03-2001)
Kommentar
Fra : Ulrik Magnusson


Dato : 22-03-01 20:33

smb wrote:

> Hej
>
> Jeg har følgende problem:
>
> I en applikation der består af 3 lag
> Præsentationslag (Servlet, JSP)
> Funktionslag (Javaklasser, muligvis senere EJB)
> Databaselag (Javaklasser, JNDI navneserver lookup mv)
>
> Jeg har desuden et Objekt som indeholder oplysninger om adgang til den
> underliggende DB2 database ( der befinder sig på henholdsvis AS/400, VMS,
> WM, NT, OS/2, senere Linux og Windows 2000)
>
> Det objekt vil jeg gerne være fri for at instantiere og læse ind fra disken
> hver gang der skal skabes en forbindelse til databasen. Men hvordan gør jeg
> det, så det samtidigt er trådsikkert ??

Dette skulle være standardmåden at gøre det på, men der er nok andre:

class ThreadSafeSingleton
{
// referencen, der returneres af getInstance()
private ThreadSafeSingleton single = null;

//efter sigende det billigste Objekt - skal bare bruges til synkronisering
private static final Object sync = new int[0];

// returnerer samme objekt hver gang
public static ThreadSafeSingleton getInstance()
{
//undgå at synkronisere alle kald
if( single == null )
{
synchronized( sync )
{
//hvis en tråd venter på en tråd, der konstruerer, skal den
ikke konstruere et nyt objekt
if( single == null )
{
single = new ThreadSafeSingleton();
}
}
}
return single;
}

//privat konstruktor - konstruktion styres af klassen
private ThreadSafeSingleton()
{
//...
}
}

Ulrik Magnusson

--
"I am the eggman. They are the eggmen. I am the walrus."
beatles - 'I am the walrus', Magical Mystery Tour
Visit my home page: http://www.geocities.com/ulrikm



Ulrik Magnusson (22-03-2001)
Kommentar
Fra : Ulrik Magnusson


Dato : 22-03-01 20:40

Ulrik Magnusson wrote:

> class ThreadSafeSingleton
> {
> // referencen, der returneres af getInstance()
> private ThreadSafeSingleton single = null;

Av! Den skal være "static".

Ulrik Magnusson
--
"I am the eggman. They are the eggmen. I am the walrus."
beatles - 'I am the walrus', Magical Mystery Tour
Visit my home page: http://www.geocities.com/ulrikm



Kasper Nielsen (23-03-2001)
Kommentar
Fra : Kasper Nielsen


Dato : 23-03-01 19:44

Nedenstående approach også oftest kaldet "Double-Checked Locking" er ikke
100 % sikkert hvis du bruger en JIT compiler eller har nogle shared memory
multiprocessors.

Du bør derfor sørge for at getInstance() er synchronized, det vil næppe
betyde det helt store i dit tilfælde.

- Kasper


> Dette skulle være standardmåden at gøre det på, men der er nok andre:
>
> class ThreadSafeSingleton
> {
> // referencen, der returneres af getInstance()
> private ThreadSafeSingleton single = null;
>
> //efter sigende det billigste Objekt - skal bare bruges til
synkronisering
> private static final Object sync = new int[0];
>
> // returnerer samme objekt hver gang
> public static ThreadSafeSingleton getInstance()
> {
> //undgå at synkronisere alle kald
> if( single == null )
> {
> synchronized( sync )
> {
> //hvis en tråd venter på en tråd, der konstruerer, skal
den
> ikke konstruere et nyt objekt
> if( single == null )
> {
> single = new ThreadSafeSingleton();
> }
> }
> }
> return single;
> }
>
> //privat konstruktor - konstruktion styres af klassen
> private ThreadSafeSingleton()
> {




Ulrik Magnusson (23-03-2001)
Kommentar
Fra : Ulrik Magnusson


Dato : 23-03-01 20:28

Kasper Nielsen wrote:

> Nedenstående approach også oftest kaldet "Double-Checked Locking" er ikke
> 100 % sikkert hvis du bruger en JIT compiler eller har nogle shared memory
> multiprocessors.

Skummelt. Det forstår jeg ikke helt - hvad kan der mere præcist ske?

Ulrik Magnusson


--
"Less we love and know how we're just morter filling holes"
Skinny Puppy - 'Morter', The Process 1996
Visit my home page: http://www.geocities.com/ulrikm



Ulrik Magnusson (23-03-2001)
Kommentar
Fra : Ulrik Magnusson


Dato : 23-03-01 20:33

Ulrik Magnusson wrote:

> Kasper Nielsen wrote:
> > Nedenstående approach også oftest kaldet "Double-Checked Locking" er ikke
> > 100 % sikkert hvis du bruger en JIT compiler eller har nogle shared memory
> > multiprocessors.
> Skummelt. Det forstår jeg ikke helt - hvad kan der mere præcist ske?

Det var ikke svært at finde noget om dette:

http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
og
http://www.javaworld.com/javaworld/jw-02-2001/jw-0209-double.html

Konklusionen er trist:
"There is no way to make it work without requiring each
thread that accesses the helper object to perform synchronization."

Nå, men så må man vel gøre det..

Ulrik Magnusson


--
"Less we love and know how we're just morter filling holes"
Skinny Puppy - 'Morter', The Process 1996
Visit my home page: http://www.geocities.com/ulrikm



Ulrik Magnusson (23-03-2001)
Kommentar
Fra : Ulrik Magnusson


Dato : 23-03-01 21:10

smb wrote:

> Det objekt vil jeg gerne være fri for at instantiere og læse ind fra disken
> hver gang der skal skabes en forbindelse til databasen. Men hvordan gør jeg
> det, så det samtidigt er trådsikkert ??

Nyt svar:

Efter lidt research har jeg fundet ud af at dette er løsningen:

public class ThreadSafeSingleton
{
private static ThreadSafeSingleton single;

public static synchronized ThreadSafeSingleton getInstance()
{
if( single == null )
{
single = new ThreadSafeSingleton();
}
return single;
}

private ThreadSafeSingleton()
{
//...
}
}

Og PLEASE correct me if I'm wrong!!!!!

Ulrik Magnusson


--
"Less we love and know how we're just morter filling holes"
Skinny Puppy - 'Morter', The Process 1996
Visit my home page: http://www.geocities.com/ulrikm



Ulrik Magnusson (23-03-2001)
Kommentar
Fra : Ulrik Magnusson


Dato : 23-03-01 21:14

Ulrik Magnusson wrote:

> smb wrote:
> > Det objekt vil jeg gerne være fri for at instantiere og læse ind fra disken
> > hver gang der skal skabes en forbindelse til databasen. Men hvordan gør jeg
> > det, så det samtidigt er trådsikkert ??
> Nyt svar:
> Efter lidt research har jeg fundet ud af at dette er løsningen:

[snip]

Og så er det vist på sin plads at citere Roedy Green:

"What the world needs now is programs that WORK, not ones that don't
work, but don't work 5% faster."

Og Donald Knuth: "Premature optimization is the root of all evil."

Ulrik Magnusson

--
"Less we love and know how we're just morter filling holes"
Skinny Puppy - 'Morter', The Process 1996
Visit my home page: http://www.geocities.com/ulrikm



Kasper Nielsen (24-03-2001)
Kommentar
Fra : Kasper Nielsen


Dato : 24-03-01 08:59

> Efter lidt research har jeg fundet ud af at dette er løsningen:
>
> public class ThreadSafeSingleton
> {
> private static ThreadSafeSingleton single;
>
> public static synchronized ThreadSafeSingleton getInstance()
> {
> if( single == null )
> {
> single = new ThreadSafeSingleton();
> }
> return single;
> }
>
> private ThreadSafeSingleton()
> {
> //...
> }
> }
>
> Og PLEASE correct me if I'm wrong!!!!!

Det vil virke.

- Kasper



Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408849
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste