【发布时间】:2015-07-05 04:42:55
【问题描述】:
我从一个非常简单的多线程示例开始。我正在尝试制作一个线程安全的计数器。我想创建两个线程,间歇性地增加计数器达到 1000。代码如下:
public class ThreadsExample implements Runnable {
static int counter = 1; // a global counter
public ThreadsExample() {
}
static synchronized void incrementCounter() {
System.out.println(Thread.currentThread().getName() + ": " + counter);
counter++;
}
@Override
public void run() {
while(counter<1000){
incrementCounter();
}
}
public static void main(String[] args) {
ThreadsExample te = new ThreadsExample();
Thread thread1 = new Thread(te);
Thread thread2 = new Thread(te);
thread1.start();
thread2.start();
}
}
据我所知,while 循环现在意味着只有第一个线程可以访问计数器,直到达到 1000。输出:
Thread-0: 1
.
.
.
Thread-0: 999
Thread-1: 1000
我该如何解决这个问题?如何让线程共享计数器?
【问题讨论】:
-
为什么你认为while循环意味着这个?
-
没有什么可以“修复”的。在线程之间切换成本很高,并且调度程序将不会交替地让线程运行以进行对
incrementCounter的单个调用。将循环变量从 1000 增加到 1000000,然后您会看到线程确实确实在两者之间发生了变化。 -
@Marco13 虽然这是一个原始示例,确实没有必要在线程之间切换,但存在这样的短而关键的任务由于一个线程占用监视器而没有执行的情况,导致线程饥饿,可能会阻止进展。在这种情况下,通过实施公平政策,肯定有一些事情需要“解决”。
-
“修复”是什么意思?您的程序按预期工作。当多个线程并行运行时,JVM 没有义务为所有线程提供处理器时间。还是你期待别的?
标签: java multithreading thread-safety counter