使用同步方法和块解决 Java 线程中的计数器问题
Solving Counter Problem in Java Thread With synchronized method and block
我刚刚在线程中编写了计数器问题的代码。当我在方法上添加同步时它工作正常但是当我在方法中使用同步块时它不起作用,为什么?我想我缺少的东西。
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
块每次都在不同的对象上同步,这使它毫无意义 - 正如您自己所见。
我刚刚在线程中编写了计数器问题的代码。当我在方法上添加同步时它工作正常但是当我在方法中使用同步块时它不起作用,为什么?我想我缺少的东西。
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
块每次都在不同的对象上同步,这使它毫无意义 - 正如您自己所见。