Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程安全秒表API_Java_Thread Safety_Stopwatch - Fatal编程技术网

Java 线程安全秒表API

Java 线程安全秒表API,java,thread-safety,stopwatch,Java,Thread Safety,Stopwatch,我想知道如何写一个线程安全秒表。下面是一个简单的秒表实现,它提供了秒表的基本操作,但它不是线程安全的 现在,我所能想到的就是将同步添加到每个方法开始、圈、停止、重置。是否存在其他方法来实现秒表上的线程安全 import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; public class Stopwatch { private long startTime; private long end

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

现在,我所能想到的就是将同步添加到每个方法开始、圈、停止、重置。是否存在其他方法来实现秒表上的线程安全

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方法,没有任何异常


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

你希望它是线程安全的,因为。。。a多个线程可以启动秒表并执行一圈,或者b一个线程可以启动秒表,而另一个线程可以使用同一个秒表完成一圈?

鉴于这些方法中的大多数都需要访问对象的大部分字段,您不妨将它们同步。如果不同的方法需要访问不同的资源,并且实现更细粒度的锁是可行的,那么您可以获得性能优势,但这里不是这样。我认为尝试使此类线程安全是不明智的。例如,如果一个线程调用start,另一个线程调用stop,会发生什么情况?如果使其线程安全,结果基本上是随机的,这无论如何都没有用。无论什么代码要调用到这段代码中,都必须进行自身同步,否则不管这个类做什么,它都会得到无意义的结果-那么,为什么要为无法真正解决问题的同步支付开销呢?我想我要实现第二个,而第一个似乎每个线程都有自己的秒表,因此不会共享同一个对象。