同步对易失性字段的写访问(廉价读写块)

2023-11-25

假设我有以下课程将被大量阅读,但只是偶尔写入。它将在多线程 Web 应用程序中使用,因此它需要是线程安全的:

public class Foo {
    private volatile String foo;
    public String getFoo() {
        return foo;
    }
    public synchronized String setFoo(String in) {
        this.foo = in;
    }
}

Java并发(http://www.ibm.com/developerworks/java/library/j-jtp06197/index.html)指出这是一种保护写访问同时改善读访问的脆弱方法。这种模式的更强大的替代方案是什么?或者如果 foo 需要在读取繁重的环境中可变,还有其他选择吗?谢谢。


Volatile 提供对字段的快速线程安全无锁访问,无需同步

private volatile String foo;

public String getFoo() {
    return foo;
}
public void setFoo(String in) {
    this.foo = in;
}

易失性解决了 3 个问题 1) 内存可见性 2) 双精度和长字段的原子写入 3) 禁止指令重新排序。但是,如果您需要将一个字段上的多个操作作为一个原子事务(例如增量),那么这还不够。这段代码已损坏

private volatile int id;

public void incrementId() {
     id++;
}

因为如果两个线程同时读取并递增它并保存结果,那么第一个递增的结果将被第二个递增的结果覆盖。为了防止这种情况发生,我们需要使用同步

 private int id;

 public synchronized int nextId() {
       return ++id;
 }

或 java.util.concurrent.atomic 包

 private AtomicInteger id = new AtomicInteger();

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

同步对易失性字段的写访问(廉价读写块) 的相关文章

随机推荐

  • Android 浏览器能够执行 xsl 转换吗?

    我有一个 xml 文件 我希望使用 xsl 文档进行转换 但我似乎无法使其在最新的可用 Android 版本上工作 我尝试添加一个
  • 无法使用 C# HttpClient 获取任何 cookie

    我正在尝试使用 C 和 HttpClient 类在 Spotify 登录页面上获取 cookie 然而 当我知道正在设置 cookie 时 CookieContainer 始终为空 我没有发送任何标头 但它仍然应该给我 cookie 因为当
  • 如何将对象传递给 Scala 中的方法

    如何将对象的引用传递给 Scala 中的方法 例如 我想要这个编译 object Constants val constantA Double def calc numbers Seq Double Constants does not c
  • 屏蔽 QLineEdit 文本

    我在用PyQt4 QLineEdit小部件接受密码 有一个setMasking属性 但不遵循如何设置掩码字符 editor QLineEdit editor setEchoMode QLineEdit Password
  • 如何在 iOS 中更改 cordova-camera-plugin 语言?

    我想改变cordova camera plugin语言 显然 它取决于多种因素 我的开发环境是 Visual Studio 2015 中的 Tools for Cordova 这不太重要 但我在我的应用程序中使用 Ionic 框架 我们在运
  • 粗体标题边框

    我尝试做 UIManager getDefaults put TitledBorder font Font BOLD contentPanel setBorder new TitledBorder Client Downloader 但这并
  • 在另一个 div 上使用滚轮时滚动一个 div [重复]

    这个问题在这里已经有答案了 假设我有 2 个并排的 div 两者都是 400px x 400px 并且溢出设置为自动 里面的内容高度超过400px所以有垂直滚动条 当鼠标悬停在左侧的 div 上并且用户使用鼠标滚轮滚动时 我希望另一个 di
  • 如何在shell中获取SVN头版本号?

    我在命令行中使用 svn 如何在命令行中获取头版本号 我需要这个号码 不仅仅是为了查看信息 我想用这个数字来自动构建我的项目 正如下面的评论提到的 这可以通过在较新的 SVN 客户端中使用以下命令来实现 svn info rHEAD sho
  • UIButton 在 iOS7 中点击时不显示突出显示

    我看过大量有关类似事物的帖子 但没有一个完全匹配或解决这个问题 从 iOS 7 开始 每当我添加UIButton to a UITableViewCell或者甚至对于页脚视图来说 它工作得 很好 这意味着它接收到目标操作 但它不会显示当您点
  • 如何在 Perl 中对 HTTP GET 查询字符串进行编码?

    这个问题有点相关在 Perl 中发出 HTTP GET 请求的最简单方法是什么 在通过以下方式提出请求之前LWP Simple我有一个需要序列化 转义的查询字符串组件的哈希值 对查询字符串进行编码的最佳方法是什么 它应该考虑空格以及有效 U
  • 在 GCC 中指定代码的节名称

    我知道 GCC 让你使用 attribute section mysection 函数定义指定将代码放入哪个部分 我有一堆代码需要放入特定部分 并且必须用它来装饰每个函数是相当乏味的 有没有办法在命令行上全局指定代码放置在哪个部分的同时编译
  • 如何指定AddIn进程名称?

    我正在使用 Microsoft AddIn Framework 加载 AddIn 程序集 我在自己的进程中运行它们 以便将它们与服务分开 我不喜欢每个 AddIn 进程在任务管理器中显示为 AddInProcess32 exe 使用进程隔离
  • git - 如何从我当前的提交中删除太大的文件[重复]

    这个问题在这里已经有答案了 当我执行以下操作时 git add git commit m msg git push origin develop 我收到以下错误 Counting objects 25 done Delta compress
  • 在node/express + ejs中将对象传递给客户端?

    我有一个相当大的对象 需要将其传递给客户端脚本中的函数 我尝试过使用 JSON stringify 但这种方法遇到了一些问题 主要与性能相关 在ejs中可以做这样的事情吗 app get load function req res var
  • C++挂钩到不同的应用程序,如何从进程ID中查找线程ID?

    我想向应用程序添加一个钩子 我在用SetWindowsHookEx我可以创建一个系统范围的挂钩 但我想为特定应用程序创建一个挂钩 我需要目标应用程序的线程 ID 才能挂钩它 我知道窗口的标题 我知道 exe 名称 从这些我可以获取窗口句柄和
  • 如何在Python中使用不带0x的hex()?

    The hex python中的函数 放置前导字符0x在号码前面 有没有办法告诉它不要放它们 所以0xfa230将fa230 代码是 import fileinput f open hexa w for line in fileinput
  • SQLite 长到宽格式?

    我想知道是否有一种规范的方法可以在 SQLite 中将数据从长格式转换为宽格式 该操作通常在关系数据库领域吗 我试着跟随这个例子对于 MySQL 但我猜 SQLite 没有相同的 IF 结构 谢谢 IF是一个非标准的 MySQL 扩展 最好
  • 带和不带箭头的 UML 聚合

    我一直认为 UML 聚合被定义为路径开头的黑色 实心 菱形 结尾处没有箭头 MyA lt gt MyB 今天我遇到了这样的符号 lt gt gt 右端有一个明确的箭头 所以我在 UML 2 4 规范中查找 实际上找到了两个版本的参考资料 我
  • 更改 R Shiny 中 selectInput 的背景颜色

    我的示例代码 library shiny server lt function input output ui lt fluidPage br selectInput select1 Choose c Alt1 1 Alt1 2 selec
  • 同步对易失性字段的写访问(廉价读写块)

    假设我有以下课程将被大量阅读 但只是偶尔写入 它将在多线程 Web 应用程序中使用 因此它需要是线程安全的 public class Foo private volatile String foo public String getFoo