Java 使用2个线程增加一个计数器
我试图增加一个计数器,它最初是0, 使用2个线程连接到1000。这是我的密码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
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++
的关键部分互斥。您需要与每个线程都有权访问的对象同步。