gpt4 book ai didi

java - 多线程JAVA中的静态方法行为

转载 作者:行者123 更新时间:2023-11-30 07:12:19 25 4
gpt4 key购买 nike

我在多线程环境中更新一个值

Class TestClass{

public static TestObject updateTestObject (TestObject testObject )
{
testObject.setLatestSequence (testObject.getLatestSequence () + 1);

return testObject ;
}

}

该值在另一个类中使用,如下所示。该函数是同步的,因此一次只能有一个线程进入其中。

Class parentClass 
{

void synchronized updateDBSequence()
{
// Read old value from DB
TestObject testObject = readFromDAO.readTestClass(naturalKey);

// Access in static manner, Issue ? If two threads go in, the object
//the return will have duplicate sequence number in it e.g. first read
//1 as latest sequence second also read 1 and both updated it to 2 and save in DB.

TestClass.updateTestObject (testObject);

// DAO has already been injected by spring
// Update value in DB
testObjectDAO.update (testObject);
}

当在多线程环境中运行时,有时,从 testClass.updateTestObject () 方法返回的对象有重复的序列,因此重复的序列会保存在 DB 中。我们希望它们始终是独一无二的

为了克服这个问题,函数 updateDBSequence () 已被同步,但这并没有解决问题,然后我们意识到 TestClass.updateTestObject () 函数可能会导致问题,因为它是静态的并且线程进入其中将不知道其他线程用什么更新了该值。

因此,为了解决这个问题,我们使用其中的实际代码更改了 Class.function 的访问方式,而不是在代码中调用具有类名的静态函数。

  void synchronized updateDBSequence()
{
// Read old value from DB
TestObject testObject = readFromDAO.readTestClass(naturalKey);

// DO not access in static manner
testObject.setLatestSequence (testObject.getLatestSequence () + 1);


// DAO has already been injected by spring
// Update value in DB
testObjectDAO.update (testObject);
}

它能解决问题吗?进入静态方法的线程是否不知道其他线程更新的值是什么,即它们正在处理的对象是共享的,并且每个线程都有自己的副本。

最佳答案

testObject.setLatestSequence(testObject.getLatestSequence() + 1);

不是原子的。

如果您使用多个 parentClass 实例,

updateDBSequence() 也不是原子的。

您建议的修改(使用实例)不会改变任何事情。最好的办法是使用事务,而不是重新发明轮子。

一个快速修复方法是在 TestClass 上进行同步。

 void updateDBSequence()
{
synchronized (TestClass.class) {
// Read old value from DB
TestObject testObject = readFromDAO.readTestClass(naturalKey);

TestClass.updateTestObject (testObject);

testObjectDAO.update (testObject);

}
}

这将解决并发调用updateDBSequence()之间的问题。如果在其他方法中使用 TestClassreadFromDAO,将会出现数据竞争情况。

关于java - 多线程JAVA中的静态方法行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39033689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com