我试图掌握Java中同步方法的概念,但是至少在我看来遇到了令人困惑的行为。
在代码中:

public class parallelUpdate
{
    public static void main(String[] args)
    {
        Ob ob = new Ob();
        new Thread(ob).start();
        new Thread(ob).start();
    }
}

class Ob implements Runnable
{
    static int cnt = 0;

    private synchronized void inc()
    {
        cnt++;
    }

    @Override
    public void run()
    {
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread());
            inc();
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}


...增量由两个胎面并行执行:

Thread[Thread-0,5,main]
Thread[Thread-1,5,main]
Thread[Thread-0,5,main]
Thread[Thread-1,5,main]
Thread[Thread-1,5,main]
Thread[Thread-0,5,main]
Thread[Thread-0,5,main]
Thread[Thread-1,5,main]


我希望对inc()方法使用synced会产生顺序递增,例如:

Thread[Thread-0,5,main]
Thread[Thread-0,5,main]
Thread[Thread-0,5,main]
Thread[Thread-0,5,main]
Thread[Thread-0,5,main]
Thread[Thread-1,5,main]
Thread[Thread-1,5,main]
Thread[Thread-1,5,main]
Thread[Thread-1,5,main]
Thread[Thread-1,5,main]


我的代码有什么问题?

最佳答案

请找到正确的代码:

 public class parallelUpdate {
        public static void main(String[] args) {
            Ob ob = new Ob();
            new Thread(ob).start();
            new Thread(ob).start();

        }
    }


    class Ob implements Runnable {
        static int cnt = 0;
        private synchronized void inc() {
              for (int i = 0; i < 5; i++) {
                  System.out.println(Thread.currentThread());
                  cnt++;
                  try {
                      Thread.sleep(100);
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
              }
        }
        @Override
        public void run() {
          inc();
        }
    }


针对您的代码的说明:-

您正在制作inc();方法作为已同步,但它们对于**for loop**不同步,因此您的两个脚踏板进入并执行inc();同步操作。

07-26 09:24
查看更多