ik was een beetje aan het proggen met java en toen gebeurde dit.
ik had een singleton die plaatjes cached die later in de AWT gebruikt worden.
voor de leken onder ons: dat betekend dat van die singleton maar 1 aangemaakt wordt en die gebruikt wordt voor alle data
(Design patterns door "de grote 4", gamma, helm,johnsen en vlissides) {nee, ik ben geen fan van hun, zo heet dat boek nu eenmaal |:(}
Om die cache te testen had ik ff een progje geschreven die met meerdere threads tergelijkertijd de cache teste. Dat gaf aleen vreemde resultaten. Na ongeveer 2 uur wist ik de fout.
wat dus gebeurt is dat thread 1 na
op dat moment is er een task switch en dan komt thread 2 bij die controlle
op dat moment worden er dus 2 cache aangemaakt.
nu had ik die getInstance synchronized gemaakt dat werkt voor de IBM java maar die van sun....
volgens de java standaard kan dit uberhoupt niet eens omdat een static functie geen object heeft en daarom met synchronized niet op slot kan.
iemand een idee om dit op te lossen zonder teveel preformance verlies of geheugengebruik ?
ik had een singleton die plaatjes cached die later in de AWT gebruikt worden.
voor de leken onder ons: dat betekend dat van die singleton maar 1 aangemaakt wordt en die gebruikt wordt voor alle data
(Design patterns door "de grote 4", gamma, helm,johnsen en vlissides) {nee, ik ben geen fan van hun, zo heet dat boek nu eenmaal |:(}
Om die cache te testen had ik ff een progje geschreven die met meerdere threads tergelijkertijd de cache teste. Dat gaf aleen vreemde resultaten. Na ongeveer 2 uur wist ik de fout.
code:
1
2
3
4
5
6
7
8
9
10
11
12
| private static Cache instance = null;
private Cache(){
// hier komt de install van de cache maar dat is later
}
public static Cache getInstance(){
if(instance == null){
instance = new Cache();
}
return instance;
} |
wat dus gebeurt is dat thread 1 na
code:
1
| instance == null komt |
op dat moment is er een task switch en dan komt thread 2 bij die controlle
nu had ik die getInstance synchronized gemaakt dat werkt voor de IBM java maar die van sun....
volgens de java standaard kan dit uberhoupt niet eens omdat een static functie geen object heeft en daarom met synchronized niet op slot kan.
iemand een idee om dit op te lossen zonder teveel preformance verlies of geheugengebruik ?
edit:
\\ vervangen door // in [code]
stom had ik moeten weten
\\ vervangen door // in [code]
Backup not found (R)etry (A)bort (P)anic<br\>AMD 3400+ 64, 2 GB DDR, 1,5 TB Raid5