Avatar billede kernelx Juniormester
28. juni 2008 - 16:53 Der er 8 kommentarer og
1 løsning

lock'e en class-variable

Hi,

jeg har foelgende test-class:
+++
package test;

class Test {
 
  private String value;

  public synchronized set( String value ) {
    this.value = value;
  }

  public String get() {
    return this.value;
  }

}
+++

Med synchronized kan jeg lock'e set-methoden. Men det er staedigvaek muligt at bruge get-methoden i en thread og set-methoden i en anden - paa samme tid.

Hvordan kan jeg lock'e
  private String value
for hele programmet, hvis jeg kaller set-methoden. Saadan, at et get-call venter til set-methoden er faerdig?


med venlig hilsen,
KernelX
Avatar billede arne_v Ekspert
28. juni 2008 - 17:00 #1
Lav get synchronized også.
Avatar billede kernelx Juniormester
29. juni 2008 - 10:54 #2
hvis der er flere threads som kaller get-methoden, saa maa de jo gerne faa fat i informationerne paa samme tid uden at blockere hinanden (vente paa hinanden).
get-methoden skal altsaa kun vente paa at faa fat i vaerdierne, hvis set-methoden er igang med at blive udfoert.

desuden har jeg faaet sagt, at hvis jeg setter to methoder synchronized, og begge methoder bliver kaldet paa samme tid, saa venter de ikke paa hinanden, pga. at det er to forskellige "monitor".
passer det ikke?
Avatar billede arne_v Ekspert
29. juni 2008 - 15:02 #3
Ah. Du vil have en 1 write eller multi read lock ?

Nej. To metoder der begge er synchronized venter på hinanden da de begge synkronisere
på objektet selv.

public synchronized void foo() {
...
}

svarer til:

public void foo() {
  synchronized(this) {
      ...
  }
}
Avatar billede arne_v Ekspert
29. juni 2008 - 15:04 #4
Hvis du er på en nyere Java kan du bruge java.util.concurrent.locks og en af
ReadWriteLock'ene.
Avatar billede arne_v Ekspert
29. juni 2008 - 15:06 #5
Hvis du er stuck med en gammel Java version så lavede jeg engang følgende kode:

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();
    }

}
Avatar billede kernelx Juniormester
30. juni 2008 - 08:19 #6
version: java 6 update 10
Avatar billede kernelx Juniormester
30. juni 2008 - 08:22 #7
>Ah. Du vil have en 1 write eller multi read lock ?
ja.

det skal vaere muligt at udfoere read-methoderne paa samme tid fra forskellige threads.
Men, der maa ikke vaere mulighed for at udfoere en read- og write-methode paa samme tid.

>Nej. To metoder der begge er synchronized venter på hinanden da de begge synkronisere
>på objektet selv.
Ah, ok. Mange tak!
Avatar billede kernelx Juniormester
30. juni 2008 - 08:59 #8
husk at skrive et eller andet som svar :-)
Avatar billede arne_v Ekspert
30. juni 2008 - 15:01 #9
svar
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