29. november 2005 - 11:03Der er
14 kommentarer og 1 løsning
Problem: hvordan deler man variabler mellem threads
Jeg har en multithreaded server, hvor der er nogle enkelte variabeler der skal være delt. Helt præcis et par ArrayList og et integer.
variabelerne bliver deklarerede i den klasse (MyServer.java) der kalder Thread start(). Iden er at mine worker threads (MyServerWorker.java)skal kunne læse og sætte disse variabeler.
Jeg vil mene at variabelerne skal deklareres som static, men det virker kun på min integer variabel, og ikke ArrayListen.
Please hjæp, jeg er ved at blive grå i hovedet over det her.
NB. Kan man nøjes med at lave de som funktioner der sætter variabelerne i (MyServer.java) synchronized eller bør de funktion er henter variabelerne også være synchronized?
public static int itegerVariabel = 0; public static ArrayList arrayListVariabel = new ArrayList(); // den skal initieres her, ikke fra dine threads.
en simpel int variabel kan du sagtens 'dele' uden synkronisering, men tilgang til arrayliste og komplexe objekter skal synkroniseres, så ikke den ene tråd ændrer på den imens en anden tråd prøver at læse hvad der står.
Og selv med en simpel int eller boolean kan det være du bør synkronisere. det kommer an på hvordan du vil bruge den. Hvis det du vil gøre spænder over tid er der risiko. eg: if ( integervariabel > 49 ) { // en rundtæller der tæller modolo 50 integervariabel = 0; } else { integervariabel += 1; } Det går ikke på en delt variabel hvor du risikerer at en anden tråd kommer til efter if testen men før din reaktion på den test. tråd 2 sætter variablen til nul or bagefter sætter du også variabelen til nul. rundtælleren mister et skridt. Så der skal der synkroniseres.
1) jeg har skrevet en artikel om singleton her på Eksperten
2) Vectors metoder er threadsafe men det er langtfra det samme som at din brug af Vector er threadsafe
3) hvis du bruger Java 1.5 så har den nogle nye features som gør brug af worker threads meget simpel
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.