Oop Servlet设计,对字段的并发访问

Oop Servlet设计,对字段的并发访问,oop,design-patterns,servlets,concurrency,reentrantreadwritelock,Oop,Design Patterns,Servlets,Concurrency,Reentrantreadwritelock,我有一个相当笼统的问题,请指教 我有一个servlet 这个servlet具有私有字段 私有字段是一种元数据(公共类元数据{//bla-bla}) 处理GET请求时,此元数据用于执行某些操作 我想在同一个servlet中实现POST方法。用户上载文件并更新元数据字段 问题:使用一个servlet实例,通过sereval web线程之间共享的元数据对象并发访问此私有字段。POST方法操作(更新元数据对象)可能导致元数据状态不一致,并发GET请求可能失败 问题:在GET请求运行时更新元数据对象的最佳

我有一个相当笼统的问题,请指教

我有一个servlet

这个servlet具有私有字段

私有字段是一种元数据(公共类元数据{//bla-bla})

处理GET请求时,此元数据用于执行某些操作

我想在同一个servlet中实现POST方法。用户上载文件并更新元数据字段

问题:使用一个servlet实例,通过sereval web线程之间共享的元数据对象并发访问此私有字段。POST方法操作(更新元数据对象)可能导致元数据状态不一致,并发GET请求可能失败

问题:在GET请求运行时更新元数据对象的最佳方法是什么

虚拟解决方案

  • 在每个GET请求期间,在开始时

  • 同步元数据对象并将其克隆到一个块中,然后释放它

  • 并发GET请求使用一致的元数据对象的克隆版本

  • 在每个POST请求期间

  • 同步元数据对象并更新其字段

  • 释放元数据对象


  • 请给出建议或批评

    在元数据类中使用同步方法set和get可以,但如果您有多个读卡器和(少得多)写卡器,则可能会减慢web应用程序的速度:

    Java synchronized关键字用于获取对 对象当线程获取对象的锁以进行读取时 或者写入时,其他线程必须等待该对象上的锁被释放 释放。想象一个场景,有许多读线程读取共享 数据频繁,并且只有一个写入线程更新共享数据。 不必在运行时以独占方式锁定对共享数据的访问 读取,因为可以并行执行多个读取操作 除非有写操作

    (摘自《美好的未来》)

    因此,在某些情况下,使用多读单写策略在性能方面可能会更好,正如同一Java5接口文档中所解释的:

    读写锁允许在内存中实现更高级别的并发 访问互斥锁允许之外的共享数据。 它利用了这样一个事实,即虽然一次只有一个线程(一个 编写器线程)可以修改共享数据,在许多情况下,可以修改任意数量的 线程可以同时读取数据(因此读线程)。在里面 理论上,通过使用 读写锁定将比使用 互斥锁。实际上,这种并发性的增加将 只有在多处理器上完全实现,并且 共享数据的访问模式是合适的

    读写锁是否会在使用过程中提高性能 互斥锁的有效性取决于数据传输的频率 读与被修改相比,读和写的持续时间 操作,以及对数据的争用-即 尝试同时读取或写入数据的线程。对于 例如,最初使用数据和 此后,在频繁搜索的同时,不经常修改 (例如某种目录)是该用途的理想候选 读写锁的安全性。但是,如果更新变得频繁,则 数据的大部分时间都被独占锁定,而且 并发性几乎没有增加。此外,如果 操作太短,导致读写锁的开销过大 实施(本质上比相互合作更复杂) 排除锁)可以控制执行成本,尤其是 读写锁实现仍然通过 代码的一小部分。最终,只有分析和测量才能解决问题 确定读写锁的使用是否适合您的应用 应用程序

    一个随时可用的实现是


    请看前面的教程,了解如何使用它。

    谢谢。这正是我需要的东西。