【问题标题】:Updating an Object from different threads从不同的线程更新对象
【发布时间】:2014-08-14 07:17:45
【问题描述】:

我同时分别调用 4 个线程。这些线程进行 http 调用并从单独的链接获取数据。 现在,我创建了一个类,实例化了该类的单个对象以访问数据。所有四个线程同时访问数据。 现在的问题是,数据没有以同步的方式存储。一个线程数据正在被另一个数据替换。如何防止这种情况?如何以同步方式进行?有任何想法吗? 请帮忙。

【问题讨论】:

  • 为了帮助您编写代码,我们将查看您的代码。

标签: java android multithreading http synchronize


【解决方案1】:

你可以使用这个子句:

synchronized (objectToLock){
     .....
     actions
     .....
}

希望对你有帮助!

【讨论】:

    【解决方案2】:

    一个很好的模式是不可变对象。优点 - 它们不需要同步,因此不需要复杂的同步逻辑

    一个对象被认为是不可变的,如果它的状态在构造后不能改变。最大限度地依赖不可变对象已被广泛认为是创建简单、可靠代码的合理策略。

    不可变对象在并发应用程序中特别有用。由于它们无法更改状态,因此它们不会被线程干扰破坏或观察到不一致的状态。

    不可变意味着对象的内部状态在构造后不能改变,因此,对象只能处于定义状态,而永远不会处于“中间”状态,因为对象创建是原子的。这也意味着,如果您想更改对象的任何属性,则必须创建一个新属性。例如,StringBigDecimal 是不可变的,而 Date 应该是。

    程序员通常不愿意使用不可变对象,因为他们担心创建新对象而不是就地更新对象的成本。对象创建的影响通常被高估,并且可以被与不可变对象相关的一些效率所抵消。其中包括由于垃圾收集而减少的开销,以及消除保护可变对象免受损坏所需的代码。

    有关更多信息,请查看 java 文档中的此部分:http://docs.oracle.com/javase/tutorial/essential/concurrency/immutable.html

    这里是与不可变对象同步时应考虑的指南:http://docs.oracle.com/javase/tutorial/essential/concurrency/imstrat.html

    【讨论】:

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