我同时分别调用4个线程。这些线程正在进行http调用,并从单独的链接中获取数据。 现在,我创建了一个类,实例化了该类的单个对象以访问数据。所有四个线程同时访问数据。 现在问题是,数据不是以同步方式存储的。一个线程数据正被另一个数据替换。怎么预防这个?如何以同步方式进行?有任何想法吗? 请帮忙。
答案 0 :(得分:2)
您可以使用以下条款:
synchronized (objectToLock){
.....
actions
.....
}
希望它可以帮到你!
答案 1 :(得分:2)
一个很好的模式是不可变对象。优点 - 它们不需要同步,因此不需要复杂的同步逻辑
如果一个对象的状态在构造后不能改变,则该对象被认为是不可变的。最大限度地依赖不可变对象被广泛接受为创建简单,可靠代码的合理策略。
不可变对象在并发应用程序中特别有用。由于它们不能改变状态,因此它们不会被线程干扰破坏或在不一致状态下被观察到。
不可变意味着对象的内部状态在构造之后不能改变,因此,对象只能处于已定义的状态,并且永远不会出现在"之间。状态,因为对象创建是原子的。这也意味着如果您想要更改对象的任何属性,则必须创建一个新属性。例如,String
或BigDecimal
是不可变的,Date
应该是。
程序员通常不愿意使用不可变对象,因为他们担心创建新对象的成本而不是更新对象。对象创建的影响经常被高估,并且可以通过与不可变对象相关联的一些效率来抵消。这些包括由于垃圾收集而减少的开销,以及消除保护可变对象免受损坏所需的代码。
有关详细信息,请参阅java文档中的此部分:http://docs.oracle.com/javase/tutorial/essential/concurrency/immutable.html
以下是与不可变对象同步时需要考虑的内容:http://docs.oracle.com/javase/tutorial/essential/concurrency/imstrat.html