Avatar billede badal Nybegynder
17. oktober 2003 - 11:14 Der er 5 kommentarer og
1 løsning

Tråde og synkronesering

Hej jeg har lige et spørgsmål til jer. Jeg har to funktioner som begge benytter en fælles resourse og den ønsker jeg at beskytte så der ikke kan fåes adgang til den på samme tid. Hvor er det lige Wait og Notify skal placeres i de to funktioner. Der hvor jeg har placeret wait/notify opstår en deadlock. Så andre bud?

Her den første funktion:

public ViewCommand ViewCommandObjS() throws RemoteException
    {
        ViewCommand viewcommand = new ViewCommand();
          synchronized(obj2)
          {
              //if
              try
              {
                  obj2.wait();
              }
              catch(Exception ex)
              {
                  System.out.println(ex);
              }
          }
         
          /*Den kritiske region*/
          Vector  v = getAll();
         
        ViewCommand k = new ViewCommand("2", "Sender3", "Sender2112", "Test");
        int n = v.indexOf(k); // finder en bestem Usp_get_action object
        System.out.println(n);
        ViewCommand vcom = new ViewCommand();
        vcom = viewcommand.getViewCommandObj(n,v);   
        /* Den kritiske region slut */
       
        obj1.notify();           
               
        return vcom;
    }

Her er den anden funktion:
public void run()
    {
        while(true)
        {
               
            synchronized(obj1)
            {
                try
                {
                    if (available)
                    obj1.wait();
                }
                catch(Exception ex)
                {
                    System.out.println(ex);
                }
               
            }
           
            // Den kritiske region
            empyVector();
            All();
            // kritiske region slut
            obj2.notify();
           
            try
            {
                Thread.sleep(5000);
            }
            catch (Exception ex)
            {}
        }
    }
Avatar billede arne_v Ekspert
17. oktober 2003 - 11:17 #1
Du behøver ikke bruge wait og notify for at beskytte en krtisk ressource !

En simpel synchronize på et shared objekt er nok.
Avatar billede Slettet bruger
17. oktober 2003 - 11:19 #2
Avatar billede soreno Praktikant
17. oktober 2003 - 11:21 #3
Når man benytter synchronized så betyder det at der maks. kan være én tråd i den synkroniserede blok (eller metode).
Avatar billede arne_v Ekspert
17. oktober 2003 - 11:21 #4
Hvis nu det kritiske objekt hedder er:

private X all;

så bruger du bare:

synchronized(all) {
  // start kritisk sektion
  ...
  // slut kritisk sektion
}

i al kode.

Så er der kun 1 tråd af gangen der bruger all.
Avatar billede badal Nybegynder
17. oktober 2003 - 11:44 #5
Hej arne,
din løsning ser ud til at virke perfekt. Jeg skal lige udføre et par test, inden du får alle pointene.
Avatar billede arne_v Ekspert
17. oktober 2003 - 11:51 #6
Java er designet til et multithreaded environment, så beskyttelse
en en "critical section" er en af de ting der er meget nemme i Java.
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