簡體   English   中英

用同步方法和塊解決Java線程中的計數器問題

[英]Solving Counter Problem in Java Thread With synchronized method and block

我只是在線程中針對計數器問題編寫了代碼。 當我在Method上添加sync時,它可以正常工作,但是當我在方法中使用Synchronized塊時,它不起作用,為什么? 我想我缺少了一些東西。

    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.lang.Integer不可更改。 當增加一個Integer ,可以將其拆箱為原始int ,然后對其進行遞增,然后將結果自動裝箱到其他Integer實例。 這意味着您的synchronized塊每次都在不同的對象上同步,使其變得毫無意義-正如您所看到的那樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM