Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用2个线程增加一个计数器_Java_Multithreading - Fatal编程技术网

Java 使用2个线程增加一个计数器

Java 使用2个线程增加一个计数器,java,multithreading,Java,Multithreading,我试图增加一个计数器,它最初是0, 使用2个线程连接到1000。这是我的密码 class CounterVar { private int val; CounterVar() { val = 0; } public void increment() { Object obj = new Object(); synchronized(obj) { val++; } } public int getVal() { re

我试图增加一个计数器,它最初是0, 使用2个线程连接到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());
  }
}
类计数器变量{
私人国际旅行社;
CounterVar(){
val=0;
}
公共空间增量(){
Object obj=新对象();
同步(obj){
val++;
}
}
公共int getVal(){
返回val;
}
}
公共课柜台{
公共静态void main(字符串[]args)引发InterruptedException{
CounterVar counter=新的CounterVar();
线程t1=新线程(()->{
对于(int i=0;i<500;i++)
counter.increment();
});
线程t2=新线程(()->{
对于(int i=0;i<500;i++)
counter.increment();
});
t1.start();
t2.start();
t1.join();
t2.连接();
System.out.println(counter.getVal());
}
}
我这里的输出不是1000,总是更少。我已经实现了同步,不明白这里出了什么问题。 我还想澄清一下,当thread1递增计数器时,我是否正在耗尽thread2


提前感谢。

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

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

  public void increment() {
    synchronized(obj) {
      val++;
    }
  }
或者,不使用obj的情况下更简单:

public synchronized void increment() {
  ...
}

同步的
obj
不是共享的,它只是一个本地对象,因此它不会阻止与
val++
的关键部分互斥。您需要与每个线程都有权访问的对象同步。