Avatar billede callisen Nybegynder
29. november 2005 - 11:03 Der 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?
Avatar billede mwl Nybegynder
29. november 2005 - 11:24 #1
I forbindelse med trådning bør du ikke bruge ArrayList, men Vector istedet, da den er threadsafe. Funktionaliteten er den samme.
Avatar billede mwl Nybegynder
29. november 2005 - 11:27 #2
Jeg tror du skal bruge en Singleton pattern istedet.

http://www.javacoffeebreak.com/articles/designpatterns/

Linket viser hvordan du kan implementere en singleton
Avatar billede callisen Nybegynder
29. november 2005 - 11:27 #3
Er det det eneste jeg skal gøre?

Til en anden gang er der andre variabeler (types) der kan volde de samme problemer?
Avatar billede callisen Nybegynder
29. november 2005 - 11:29 #4
Hvorfor kan man ikke bare benytte synchronized funktioner, jeg har dog ikke testede det da det er svært at teste?
Avatar billede callisen Nybegynder
29. november 2005 - 11:30 #5
NB jeg er ny her på eksperten hvordan deler man points ud ved svar?
Avatar billede callisen Nybegynder
29. november 2005 - 11:32 #6
En anden ting, fremgangsmåden er den ellers ikke OK?
Avatar billede mwl Nybegynder
29. november 2005 - 11:32 #7
Jamen hvis du mener jeg har givet dig tilstrækkeligt svar, kan du giver mig point her :)

Jeg er ikke helt sikker på hvad dit problem er? Du skriver at det kun virker på din int. Hvad er det der ikke virker på ArrayListen?
Avatar billede jakoba Nybegynder
29. november 2005 - 11:33 #8
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.
Avatar billede callisen Nybegynder
29. november 2005 - 11:36 #9
ArrayListen er tom når en anden worker (ny client connecter) og prøver at læse fra ArrayListen
Avatar billede callisen Nybegynder
29. november 2005 - 11:37 #10
jakoba, det gør jeg også men dog sker dette i constructoren
arrayListVariabel = new ArrayList();
Avatar billede callisen Nybegynder
29. november 2005 - 11:39 #11
mwl
vil det sige at man ikke kan dele arrayList mellem threads?
Avatar billede callisen Nybegynder
29. november 2005 - 11:44 #12
mwl når jeg prøver at acceptere sker der ikke en skid hvorfor?
Har du fået dine points?
Avatar billede mwl Nybegynder
29. november 2005 - 12:22 #13
Arraylisten kan godt deles mellem tråde, men du kan recikere at du får vrøvl i selve listen.
Avatar billede simonvalter Praktikant
29. november 2005 - 18:59 #14
En arraylist saktens synkronizeres som en vector.
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html#synchronizedList(java.util.List)
Avatar billede arne_v Ekspert
29. november 2005 - 23:35 #15
et par kommentarer:

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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester