Avatar billede arnejan Nybegynder
06. april 2004 - 22:42 Der er 7 kommentarer og
1 løsning

Avanceret syncronize spørsmål

Jeg ønsker at skabe noget lidt speciel kode, jeg håber jeg kan forklare det.

Jeg ønsker to metoder

public void metode1()
{
synchronized(SyncRoot.sync1)
{
  //kode
  //kode
}           
}

Dvs metode 1 skal bare låse helt normalt, så at der aldrig kan uføres to metode1 samtidig.

Men så vil jeg også have en metode 2

publiv void metode2()
{
//kode
//kode
}

Jeg ønsker nu at metode2 også skal låse på SyncRoot.sync1, således at dens kode først bliver udført når alle metode1, er afsluttet, og at mens dens kode bliver udført, kan anden kode i metode1 ikke blive udført.

Men men

Hvis jeg bare skriver:

public void metode2()
{
synchronized(SyncRoot.sync1)
{
  //kode
  //kode
}           
}

Bliver metode2 jo også låse på sig selv, og det ønsker jeg ikke. Den skal kun være låst i forhold til metode1.

(
Min SyncRoot klasse indeholde bare nogen objecter jeg kan  bruge til at låse på.
)

?????

Spændende .
Avatar billede arnejan Nybegynder
06. april 2004 - 22:43 #1
Jeg mener der må gerne kunne køre flere metode2 samtidig.
Avatar billede arne_v Ekspert
06. april 2004 - 23:38 #2
Forslag:

public class MultiSemaphore {
    public final static int EXCLUSIVE = 1;
    public final static int SHARED = 2;
   
    private int nouser;
    private int mode;

    public MultiSemaphore() {
        nouser = 0;
    }

    public synchronized void get(int mode) {
        while ((this.mode == EXCLUSIVE || mode == EXCLUSIVE) && nouser > 0) {
            try {
                wait();
            } catch (InterruptedException e) {
                // ignore
            }
        }
        nouser++;
        this.mode = mode;
    }
   
    public synchronized void release() {
        nouser--;
        notifyAll();
    }
   
}

public class DinKlasse {
    private static MultiSemaphore sem = new MultiSemaphor();
    public void metode1() {
        sem.get(MultiSemaphore.EXCLUSIVE);
        ...
        sem.release();
    }
    public void metode2() {
        sem.get(MultiSemaphore.SHARED);
        ...
        sem.release();
    }
}
Avatar billede arnejan Nybegynder
06. april 2004 - 23:52 #3
Den kode skal jeg lige kigge lidt på.

Det ser spændende ud.

Øjeblik
Avatar billede arne_v Ekspert
12. april 2004 - 20:11 #4
Kommet videre ?
Avatar billede arnejan Nybegynder
13. april 2004 - 23:22 #5
Ja, men det virkede vist fint til formålet. Desværre løste det bare ikke mit konkrette problem (med en javaapplet som nogen gange får IE til at hænge).

Men jeg lærte en masse nyt om java.

Synes også måske at måden at gøre det på er lidt dårlig, fordi den har det med en tæller (nouser) som tæller op og ned. Hvis så en "klient" fryser eller lukker ned, bryder systemet jo sammen, ville nok forsøge selv at udvikle en løsning uden en tæller (men måske kan det slet ikke lade sig gøre).

Men nu er det lidt ligemeget, ide jeg har udskudt problemet lidt.
Avatar billede arnejan Nybegynder
13. april 2004 - 23:22 #6
Men du skal da have dine point, havde godt nok ikke regnet med at nogen kunne svare.
Avatar billede arne_v Ekspert
13. april 2004 - 23:27 #7
Man kunne udbygge klassen med en timeout, hvis man ville løse
problemet med forsvindende klienter.
Avatar billede arnejan Nybegynder
14. april 2004 - 00:03 #8
jo det kan jeg godt se,
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