【问题标题】:two android threads and not synchronized data两个android线程和不同步的数据
【发布时间】:2010-04-06 23:06:59
【问题描述】:

我有一个(也许是愚蠢的)问题:

我使用 2 个线程,一个是写入浮点数,一个是永久读取这个浮点数。我的问题是,当我不同步它们时会发生什么更糟的事情?如果某些值不正确,那也没有问题,因为它们每次写入操作都会切换一点。我目前以这种方式运行应用程序并且没有任何问题,所以我想知道会发生什么更糟的情况?

读/写冲突会导致像 12345 这样的数字被写入 54321 并且红色同时出现例如 54345 ?或者可能发生更糟糕的事情? (我不想使用同步来尽可能快地保持代码)

【问题讨论】:

    标签: android multithreading synchronized


    【解决方案1】:

    可能发生的最糟糕的情况是您的读者线程永远不会看到您的作者线程所写的任何内容。不能保证一个线程写入的内存在没有某种形式的同步的情况下会被另一个线程看到。

    【讨论】:

    • 感谢您的信息:) 但为什么会这样?数据在内存中的位置在重写时会发生变化吗?
    • @Sponge:线程可能有自己的更新变量的本地副本。同步除了仅仅防止竞争条件之外,还保证任何线程本地的数据副本对所有其他线程都是可见的。
    【解决方案2】:

    如果一个线程正在写入特定的浮点数并将值从“a”更改为“b”,另一个读取相同浮点数的线程将只能看到“a”或“b”,而不会看到第三个值。

    至于您的应用可能遇到的任何其他潜在逻辑问题,如果不了解您的应用的更多信息,就无法回答这个问题。

    【讨论】:

    • 请注意,您的第一点适用于浮点数,但不一定适用于其他数据类型,例如 doublelong。不保证对这些类型的变量的写入是原子的。
    • 有趣,我不知道。
    • ...除非它们被标记为“易失性”。 JLS 保证对 volatile long 和 double 的读写是原子的。
    【解决方案3】:

    最坏的情况是您的用户发现您的应用程序是错误的,因为它由于并发问题而无法正常运行。

    无竞争锁不会增加太多开销。您应该始终首先正确编写应用程序,然后仅在运行指示问题区域所在位置的指标后进行优化。我敢打赌,您的许多应用程序代码很可能是性能问题的根源,而不是一些基本的同步。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多