使用synchronized方法和块解决Java线程中的计数器问题

问题描述 投票:0回答:1

我刚刚在线程中编写了计数器问题的代码。当我在方法上添加同步时,它工作正常,但是当我在方法内使用同步块时,它不起作用,为什么?我想我缺少一些东西。

    public class CounterProblem {
    class Counter implements Runnable {
        private Integer count = 0;

        @Override
        public void run() {
            for(int i = 0; i < 10000; i++) {
                increment();
            }
        }
//      THIS GIVES 20000 which is correct every time.
        public synchronized void increment() {
            count++;
        }
//      THIS GIVES wrong every time. WHY ?
//      public void increment() {
//          synchronized(count) {
//              count++;
//          }
//      }
    }
    public static void main(String[] args) throws InterruptedException {
        CounterProblem counterProblem = new CounterProblem();
        Counter counter = counterProblem.new Counter();
        Thread thread1 = new Thread(counter);
        Thread thread2 = new Thread(counter);
        thread1.start();
        thread2.start();
        thread1.join();
        thread2.join();
        System.out.println(counter.count);
    }
}
java multithreading synchronized
1个回答
4
投票

java.lang.Integer
是不可变的。当您递增
Integer
时,您将其拆箱为原始
int
,递增它,然后将结果自动装箱到不同的
Integer
实例。这意味着您的
synchronized
块每次都会在不同的对象上同步,这使得它毫无意义 - 正如您所看到的那样。

© www.soinside.com 2019 - 2024. All rights reserved.