使用 2 个线程增加计数器

Jon*_*n B 0 java multithreading

我正在尝试使用 2 个线程将最初为 0 的计数器增加到 1000。这是我的代码

class CounterVar {
  private int val;

  CounterVar() {
    val = 0;
  }

  public void increment() {
    Object obj = new Object();
    synchronized(obj) {
      val++;
    }
  }

  public int getVal() {
    return val;
  }
}

public class Counter {
  public static void main(String[] args) throws InterruptedException {
    CounterVar counter = new CounterVar();
    Thread t1 = new Thread(() - > {
      for (int i = 0; i < 500; i++)
        counter.increment();
    });
    Thread t2 = new Thread(() - > {
      for (int i = 0; i < 500; i++)
        counter.increment();
    });
    t1.start();
    t2.start();
    t1.join();
    t2.join();
    System.out.println(counter.getVal());
  }
}
Run Code Online (Sandbox Code Playgroud)

我在这里没有得到 1000 的输出,它总是更少。我已经实现了同步,但不明白这里有什么问题。还想澄清一下,当线程 1 增加计数器时,我是否在饿死线程 2。

提前致谢。

Bur*_*dar 8

您没有正确同步线程。要同步多个线程,您必须使用一个公共对象作为同步机制,但是您要为每个线程创建一个新对象。相反,试试这个:

class CounterVar {
  private int val;
  private final Object obj = new Object();

  public void increment() {
    synchronized(obj) {
      val++;
    }
  }
Run Code Online (Sandbox Code Playgroud)

或者,更简单的没有obj

public synchronized void increment() {
  ...
}
Run Code Online (Sandbox Code Playgroud)