从不同的线程更新对象

时间:2014-08-14 07:17:45

标签: java android multithreading http synchronize

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

2 个答案:

答案 0 :(得分:2)

您可以使用以下条款:

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

希望它可以帮到你!

答案 1 :(得分:2)

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

  

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

     

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

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

  

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

有关详细信息,请参阅java文档中的此部分:http://docs.oracle.com/javase/tutorial/essential/concurrency/immutable.html

以下是与不可变对象同步时需要考虑的内容:http://docs.oracle.com/javase/tutorial/essential/concurrency/imstrat.html