线程安全的秒表API

时间:2012-06-25 00:24:03

标签: java thread-safety stopwatch

我想知道如何编写一个线程安全的秒表。下面是一个简单的秒表实现,它提供了秒表的基本操作,但它不是线程安全的。

现在,我能想到的就是为每个方法添加同步(start(),lap(),stop(),reset())。是否有其他方法可以在秒表上实现线程安全?

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

public class Stopwatch {
    private long startTime;
    private long endTime;
    private boolean isRunning;

    // lapTimes is able to record all the lap time.
    private CopyOnWriteArrayList<Long> lapTimes;

    Stopwatch() {
        isRunning = false;
        lapTimes = new CopyOnWriteArrayList<Long>();
    }

    public void start() {
        if (!isRunning) {
            isRunning = true;
            startTime = System.currentTimeMillis();
        } else {
            throw new IllegalStateException("cannot start when running!");
        }
    }

    public void lap() {
        if (isRunning) {
            endTime = System.currentTimeMillis();
            lapTimes.add(endTime - startTime);
            startTime = endTime;
        } else {
            throw new IllegalStateException("cannot lap when not running!!");
        }
    }

    public void stop() {
        if (isRunning) {
            endTime = System.currentTimeMillis();
            lapTimes.add(endTime - startTime);
            isRunning = false;
        } else {
            throw new IllegalStateException("cannot stop when not running!");
        }
    }

    public void reset() {
        isRunning = false;
        lapTimes.clear();
    }

    public List<Long> getLapTime() {
        return lapTimes;
    }

}

我想要做的是通过多个线程共享一个秒表对象。

假设我们有两个线程:线程A和线程B.线程A启动秒表,并且延迟几秒钟,它称为停止。虽然刚刚完成if语句(stop方法中的第一行),但调用了线程B,并且它也调用了stop方法。之后,线程A继续执行stop方法,没有任何例外。

这不是我想要的,因为线程安全的秒表无法停止两次,我只想知道如何摆脱它。

1 个答案:

答案 0 :(得分:-1)

你想要它是线程安全的,因为......(a)多个线程可以启动秒表和行动圈,或者(b)一个线程可能启动秒表,而另一个线程可以用相同的秒表完成一圈?