Java 并发 API 的锁未按预期工作
Java Concurrent API's Lock not working as intended
我正在尝试使用 Java 并发锁 API 同步 2 个线程。该代码基本上使用 2 个线程将计数器递增到某个数字,但即使在使用锁后我得到的结果也小于所述数字。
代码-
import java.util.concurrent.*;
import java.util.concurrent.locks.ReentrantLock;
class DemoClass {
public int count =0;
public ReentrantLock lock = new ReentrantLock();
public void increment() {
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
}
}
public class Main {
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(2);
DemoClass demoClass = new DemoClass();
int i=0;
for(;i<=10000;i++) {
executor.submit(demoClass::increment);
}
executor.shutdown();
System.out.println( demoClass.count); // 10000
}
}
不知道我做错了什么。
您没有等待所有线程完成。 executor.shutdown()
刚刚停止 executor
接受新工作。
您需要在 executor.shutdown();
之后使用 executor.awaitTermination(...)
。
此外,您应该用 lock/unlock 对包围 demoClass.count
的读取,以便在线程中对变量的写入和读取之间建立 happens-before 关系。
我正在尝试使用 Java 并发锁 API 同步 2 个线程。该代码基本上使用 2 个线程将计数器递增到某个数字,但即使在使用锁后我得到的结果也小于所述数字。 代码-
import java.util.concurrent.*;
import java.util.concurrent.locks.ReentrantLock;
class DemoClass {
public int count =0;
public ReentrantLock lock = new ReentrantLock();
public void increment() {
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
}
}
public class Main {
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(2);
DemoClass demoClass = new DemoClass();
int i=0;
for(;i<=10000;i++) {
executor.submit(demoClass::increment);
}
executor.shutdown();
System.out.println( demoClass.count); // 10000
}
}
不知道我做错了什么。
您没有等待所有线程完成。 executor.shutdown()
刚刚停止 executor
接受新工作。
您需要在 executor.shutdown();
之后使用 executor.awaitTermination(...)
。
此外,您应该用 lock/unlock 对包围 demoClass.count
的读取,以便在线程中对变量的写入和读取之间建立 happens-before 关系。