0

I am newbie for java programming. When i write a small multi-thread program, i meet an issue. Here is my code:

package com.elqstux.study;

import java.util.logging.Logger;

class Counter {
    private volatile int value;

    public Counter(int value) {
        this.value = value;
    }

    public void add(int n) {
        synchronized (this) {
            this.value += n;
        }
    }

    public int getValue() {
        synchronized (this) {
            return this.value;
        }
    }
}

class App {
    private static final Logger logger = Logger.getLogger(App.class.getName());
    public static void main(String[] argv) {
        final Counter counter = new Counter(0);
        System.out.println(Thread.currentThread().getName());
        for (int i = 0; i < 10; i++) {
            new Thread("" + i) {
                public void run() {
                    counter.add(1);
                    System.out.println("Thread: " + getName() + " running" + ", value = " + counter.getValue());
                }
            }.start();
        }
        System.out.println(String.valueOf(counter.getValue()));
    }
}

The output is:

main
Thread: 0 running, value = 1
Thread: 1 running, value = 2
Thread: 2 running, value = 3
Thread: 3 running, value = 4
Thread: 4 running, value = 5
Thread: 5 running, value = 6
Thread: 6 running, value = 7
Thread: 7 running, value = 8
8
Thread: 9 running, value = 9
Thread: 8 running, value = 10

The issue is about System.out.println(String.valueOf(counter.getValue()));, it output 8, i think the right value shuold be 10. Who can tell me the reason?

BlackMamba
  • 10,054
  • 7
  • 44
  • 67

0 Answers0