我正在尝试创建两个线程,使用线程安全的方法读写计数器。
我编写了一些代码来测试这个问题,但是读取线程只能读取到计数器的最大值(1000)。
主要代码:
public static void main(String[] args) {
Counter c = new Counter();
Thread inc = new Increment(c);
Thread read = new Read(c);
inc.start();
read.start();
}
计数器:
public class Counter {
private int count;
public Counter() {
count = 0;
}
public synchronized void increment() {
count++;
}
public synchronized int getVal() {
return count;
}
}
增量:
public class Increment extends Thread {
private static final int MAX = 1000;
private Counter myCounter;
public Increment(Counter c) {
myCounter = c;
}
public void run() {
for (int i = 0; i < MAX; i++) {
myCounter.increment();
}
}
}
阅读:
public class Read extends Thread {
private static final int MAX = 1000;
private Counter myCounter;
public Read(Counter c) {
myCounter = c;
}
public void run() {
for (int i = 0; i < MAX; i++) {
System.out.println(myCounter.getVal());
}
}
}
我是否最好使用原子整数来保存计数器的值,以便安全地增加它并获取该值?
synchronized
代码块都会阻塞另一个线程,因为该线程不是对象的隐式锁的所有者。 - diginoise1_000_000_000
),您应该会看到一些线程交错。数到1000并不需要努力。如果您希望读者在写入(递增)后立即读取,可以添加wait()
和notify()
,而使用AtomicInteger是一个更好的解决方案。 - diginoise