gpt4 book ai didi

java - 所有CRUD操作的线程安全列表

转载 作者:行者123 更新时间:2023-12-03 12:59:03 25 4
gpt4 key购买 nike

最近,我进行了一次编码练习,其中我必须创建以下三个服务:

  • 创建:创建新事务
  • Get:获取过去60秒内的所有记录并删除所有较旧的记录
  • 删除:删除所有交易

  • 因此,对于这些服务,我创建了以下用于事务存储的类。但是根据我的代码审阅者的说法,以下代码不是线程安全的。

    由于使用多种方法添加和删除陈旧的事务,因此在某些情况下可能会丢失有效的事务。

    有人可以查看下面的代码,并告诉我在线程安全性和性能方面可以改进的地方吗?
    public class TransactionMemory {

    private List<Transaction> transactions = new CopyOnWriteArrayList<>();

    public void newTransaction(Transaction transaction) {

    transactions.add(transaction);
    }

    public List<Transaction> trxsInLast60Seconds() {
    List<Transaction> filteredTransactions = transactions.stream()
    .filter(p -> Instant.parse(p.getTimestamp()).isAfter(DateHelperUtils.getLast60SecondsByNow()))
    .collect(Collectors.toList());
    removeOldTransactions(filteredTransactions);
    return filteredTransactions;
    }

    private void removeOldTransactions(List<Transaction> filteredTransactions){
    transactions.retainAll(filteredTransactions);
    }
    public void deleteTransactions() {
    transactions.clear();
    }
    }

    最佳答案

    CopyOnWriteArrayList 类确实是线程安全的,但是它太昂贵了,因为

    all mutative operations (add, set, and so on) are implemented by making a fresh copy of the underlying array



    这是使用 ArrayList的解决方案:
    public class TransactionMemory {

    private final List<Transaction> transactions = new ArrayList<>();

    public synchronized void newTransaction(Transaction transaction) {
    transactions.add(transaction);
    }

    public synchronized List<Transaction> trxsInLast60Seconds() {
    List<Transaction> filteredTransactions = transactions.stream()
    .filter(p -> Instant.parse(p.getTimestamp()).isAfter(DateHelperUtils.getLast60SecondsByNow()))
    .collect(Collectors.toList());
    removeOldTransactions(filteredTransactions);
    return filteredTransactions;
    }

    private void removeOldTransactions(List<Transaction> filteredTransactions) {
    transactions.retainAll(filteredTransactions);
    }

    public synchronized void deleteTransactions() {
    transactions.clear();
    }
    }

    由于所有可变操作都已同步,因此它是线程安全的。

    关于java - 所有CRUD操作的线程安全列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53172851/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com