多线程访问LinkedList时的线程安全

2024-02-22

我的应用程序需要保留对特定资源的请求的访问日志,并且多个线程将记录日志条目。唯一相关的信息是请求的时间戳,检索的统计信息将是过去 X 秒内发生的请求数量。返回给定秒数的统计信息的方法还需要支持多线程。

我正在考虑使用以下方法来处理并发处理Locks http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/package-frame.html框架,我对此不是最熟悉,因此这个问题。这是我的代码:

import java.util.LinkedList;
import java.util.concurrent.locks.ReentrantLock;

public class ConcurrentRecordStats 
{
    private LinkedList<Long> recLog;
    private final ReentrantLock lock = new ReentrantLock();

    public LinkedConcurrentStats()
    {
        this.recLog = new LinkedList<Long>();
    }

    //this method will be utilized by multiple clients concurrently
    public void addRecord(int wrkrID)
    {
        long crntTS = System.currentTimeMillis();
        this.lock.lock();
        this.recLog.addFirst(crntTS);
        this.lock.unlock();
    }

    //this method will be utilized by multiple clients concurrently
    public int getTrailingStats(int lastSecs)
    {
        long endTS = System.currentTimeMillis();
        long bgnTS = endTS - (lastSecs * 1000);

        int rslt = 0;

        //acquire the lock only until we have read
        //the first (latest) element in the list
        this.lock.lock();

        for(long crntRec : this.recLog)
        {
            //release the lock upon fetching the first element in the list
            if(this.lock.isLocked()) 
            {
                this.lock.unlock();
            }

            if(crntRec > bgnTS)
            {
                rslt++;
            }
            else
            {
                break;
            }
        }

        return rslt;
    }
}

我的问题是:

  1. 这个会不会用ReentrantLock确保线程安全?
  2. 是否需要使用锁getTrailingStats?
  3. 我可以使用以下方法完成这一切吗synchronized块?我使用锁的原因是因为我想在 R 和 W 部分中使用相同的锁,以便一次在一个线程中完成列表中第一个元素(最近添加的条目)的写入和读取,并且我不能只用synchronized.
  4. 我应该使用可重入读写锁 http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html反而?

锁可能会成为主要的性能瓶颈。另一种方法是使用并发链接双端队列 http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentLinkedDeque.html: use offerFirst添加新元素,并使用(弱一致)iterator(这不会抛出ConcurrentModificationException) 代替 for-each 循环。优点是这将比您的实现或比synchronizedList实现,但缺点是迭代器是弱一致的 - 线程 1 可能会在线程 2 迭代列表时向列表中添加元素,这意味着线程 2 不会计算这些新元素。但是,这在功能上相当于让 thread2 锁定列表,以便 thread1 无法添加到列表中 - 无论哪种方式,thread2 都不会计算新元素。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多线程访问LinkedList时的线程安全 的相关文章

随机推荐

  • 如何使用 Jquery 获取文件的真实路径[重复]

    这个问题在这里已经有答案了 如何使用 input type file 获取文件的真实路径 即 HTML 代码
  • Python 套接字/端口转发

    我用 Python 编写了服务器和客户端程序 服务器 py import socket sock socket socket socket AF INET socket SOCK STREAM host socket gethostname
  • MySQL 限制变量

    我的语法有错误 SET start 0 SELECT ROUND count item 2 FROM car INTO until SELECT FROM car LIMIT until OFFSET start 您的 SQL 语法有错误
  • 为什么 Enum.Parse() 返回对象?

    这里有很多关于将字符串转换为枚举值的问题 一般来说 答案看起来类似于这个问题 https stackoverflow com q 16100 298754 StatusEnum MyStatus StatusEnum Enum Parse
  • Xcode UI 测试手册快照

    我想使用 Xcode 7 中引入的 UI 测试手动从我的应用程序中截取一些快照 默认情况下 Xcode 会截取每个步骤的屏幕截图 结果我得到了在视图控制器之间的转换中间截取的屏幕截图 我想在特定时刻手动拍摄快照 有什么想法如何做到这一点 我
  • 如何使用 numba 在 GPU 上推广快速矩阵乘法

    最近 我一直在尝试使用 Numba 库在 Python 中进行 GPU 编程 我一直在他们的网站上使用那里的教程阅读它 目前我陷入了他们的示例 可以在这里找到 https numba pydata org numba doc latest
  • ARKit 中的 ChromaKey 视频

    我正在尝试在 ARKit 中对视频进行色度键控 我所做的与 Felix 在这里所做的非常相似 SKScene 中的 GPUImageView 作为 SKNode 材质 在 ARKit 上播放透明视频 https stackoverflow
  • 如何配置 AngularFireAuthModule 和/或 AngularFireAuth 以指向身份验证模拟器

    我相信 auth 模拟器是在 2020 年 10 月底发布的 验证模拟器功能请求 https github com firebase firebase tools issues 1677我正在尝试配置我的本地服务的角度应用程序以通过让 An
  • epplus 使用 LoadFromCollection 和匿名类型

    我有一个IEnumerabledataSource 其中包含匿名类型的集合 匿名类型的实际结构在设计时是未知的 因此我试图找到一个可以处理任何匿名类型的通用解决方案 如何将它们加载到 epplus 中以创建电子表格 我有一个名为 ws 的工
  • 如何在绘图中添加注释水平或垂直参考线?

    如果这很重要的话 我正在使用 plotly 来进行 R 输出 并使用 shiny 我想向由以下命令创建的水平或垂直参考线添加注释layout shapes 它应该能够动态改变位置 以便无论图表如何放大或缩小 它都保持可见 近似示例 http
  • C 语言:if() 没有 else():使用大括号失败

    我对 IF 表达式后是否需要大括号感到困惑 当使用 IF ELSE 时 我习惯在 IF 和 ELSE 块周围使用大括号 但是当我不使用 ELSE 块时 它可以在没有大括号的情况下工作 并且在有大括号的情况下失败 工作原理 IF 失败 IF
  • 机器人框架 - UnicodeDecodeError:“ascii”编解码器无法解码位置 49 中的字节 0xe9:输入文本时序号不在范围(128)内

    我正在使用 selenium 从数据库查询值以在输入字段中输入 但是 对于某些值 我收到以下错误 UnicodeDecodeError ascii 编解码器无法解码字节 0xe9 位置 49 序数不在范围内 128 当在文本字段中输入的值类
  • 重载 && 和 || 实际上是否有原因?不短路吗?

    运营商的短路行为 and 对于程序员来说是一个了不起的工具 但为什么它们在超载时会失去这种行为呢 我知道运算符只是函数的语法糖 但运算符bool有这种行为 为什么要限制为这种单一类型 这背后有什么技术原因吗 所有设计过程都会导致相互不兼容的
  • 将现有 Webdriver 对象传递给 Robot Framework 的自定义 Python 库

    我正在尝试为 Robot Framework 创建自定义 Python 库 但我对 Python 和 Robot 很陌生 并且不确定如何完成我想要做的事情 我想将 Robot 使用 Selenium2Library 创建的 Webdrive
  • 具有自定义注册控制器的设置设备

    我正在使用 devise 开发一个 Rails 站点 我们还不希望用户注册 用户身份验证使我们可以登录以访问网站的受限部分并添加 编辑我们认为合适的内容 所以现在 我创建了以下控制器 class Users RegistrationCont
  • 如何检查日期是否在日期字符串列表中?

    这将始终打印 false 如何检查日期是否在数组中并打印正确的内容 dates 2012 09 03 2012 10 08 2012 10 09 2012 11 12 more values snipped for brevity 2013
  • 圆柱/圆锥上均匀生成 3D 点

    我希望在圆柱体和圆锥体上 分别 随机且均匀地生成点 圆柱体由其中心 半径和高度定义 锥体规格相同 我能够获得每个形状的边界框 因此我正在考虑在边界框内生成点 但是 我不确定如何将它们投影到圆柱体 圆锥体上 或者这是否是最好的主意 有什么建议
  • Redis 模仿 MASTER/MASTER?或者是其他东西?

    我已经阅读了这里的很多帖子并上网冲浪 但也许我没有问正确的问题 我知道 Redis 目前是主 从 直到 Cluster 可用 但是 我想知道是否有人可以告诉我如何在逻辑上配置 Redis 以满足我的需求 或者它是否不是正确的工具 设想 我们
  • 如何使用 XPath/XSLT fn:json-to-xml

    我需要将 JSON 字符串转换为 XML 字符串 标签确实包含属性 从答案中this https stackoverflow com questions 38783463 how to convert badgerfish style js
  • 多线程访问LinkedList时的线程安全

    我的应用程序需要保留对特定资源的请求的访问日志 并且多个线程将记录日志条目 唯一相关的信息是请求的时间戳 检索的统计信息将是过去 X 秒内发生的请求数量 返回给定秒数的统计信息的方法还需要支持多线程 我正在考虑使用以下方法来处理并发处理Lo