Avatar billede kernelx Juniormester
11. januar 2008 - 09:55 Der er 4 kommentarer og
1 løsning

update variable på samme tid

Hi,

jeg har to java-filer:
...
package test.theadtest;

public class Thread1 {
    public int value = 0;
   
    public static void main (String[] args) {
        try {
            System.out.println("start...");
            Thread1 test = new Thread1();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
   
    public Thread1() {
        Thread2 t1 = new Thread2(this, "Thread1");
        Thread2 t2 = new Thread2(this, "Thread2");
    }
}
...

og

...
package test.theadtest;

public class Thread2 extends Thread {
    private String  name    = null;
    private Thread1 thread1 = null;
   
    public void test() {
        for (int i=0; i<50; i++) {
            int testValue = ++thread1.value;
            System.out.println(this.name + ": " + testValue);
        }
    }
   
    @Override public void run() {
        this.test();
    }
   
    public Thread2(Thread1 thread1, String name) {
        this.name    = name;
        this.thread1 = thread1;
        start();
    }
}
...

Mit spørgsmål er:
kan jeg være 100% sikker på, at name:Thread1 aldrig vil få den samme value-værdi som name:Thread2 - og omvent?

med venlig hilsen
KernelX
Avatar billede jakoba Nybegynder
11. januar 2008 - 14:17 #1
Det hænger på om operationen    ++thread1.value    er udelelig, og det mener jeg ikke at Java lover den er.

Den 100% sikre måde at sørge for at all 100 numre bliver forskellige er at syncroniseregøre operationen  ++thread1.value
    public void test() {
        int testValue;
        for (int i=0; i<50; i++) {
            synchronized (this) {
                testValue = ++thread1.value;
            }
            System.out.println(this.name + ": " + testValue);
        }
    }

mvh JakobA
Avatar billede jakoba Nybegynder
11. januar 2008 - 14:45 #2
Ups. det var da gylle.
i ekseplet låser jeg på 'this', og 'this' betyder 'den aktuelle instans af Thread2.
Jeg burde låse på Thread1 klassen

    public void test() {
        int testValue;
        for (int i=0; i<50; i++) {
            synchronized (thread1) {
                testValue = ++thread1.value;
            }
            System.out.println(this.name + ": " + testValue);
        }
    }
Avatar billede arne_v Ekspert
11. januar 2008 - 15:37 #3
Read og write af int er begge atomic i Java. Det samme gaelder ikke for long.

http://java.sun.com/docs/books/jls/third_edition/html/memory.html#17.7

Men read+write (og det er ++ operatoren) er aldrig atomisk.

Se f.eks. http://www.informit.com/guides/content.aspx?g=java&seqNum=248 for bekraeftigelse.

Du kan enten bruge synchronized som Jakob bruger (det ville jeg ogsaa bruge) eller
hvis du er paa 1.5 eller hoejere bruge AtomicInteger.
Avatar billede kernelx Juniormester
12. januar 2008 - 15:37 #4
mange tak.
husk at skrive et eller andet som svar.
Avatar billede jakoba Nybegynder
12. januar 2008 - 18:56 #5
OK
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