gpt4 book ai didi

java - 只有一个线程需要同步吗

转载 作者:行者123 更新时间:2023-11-29 03:04:09 25 4
gpt4 key购买 nike

如果我有一个用静态方法扩展 Thread 的类(这非常简单):

public class MyThread extends Thread {

private static long SLEEP_INT = 30000;
private static Map<Integer, String> myData;

//every 30 seconds, update map of data
public void run() {
while(isActive) {
try {
populateDataFromDB();
Thread.sleep( SLEEP_INT );
}
catch( Exception e ) {
//do nothing
}
}
}

//static method to update map of data
public static void populateDataFromDB() {
//do stuff here, setting values in myData
}
}

然后在我的应用程序的其他地方我有:

MyThread.populateDataFromDB();

如果我知道我的应用程序中只有一个 MyThread 类的实例,是否仍然需要在 populateDataFromDB 中编写同步代码以确保线程安全吗?

最佳答案

您确实需要同步,因为您将有多个线程访问 MyThread.myData 中保存的数据。您向我们展示了一个线程,它将定期从您的数据库中读取并填写您的 map 。只有当您有要利用这些数据的东西时,您才会这样做。

您不希望使用 Map 的线程看到半填充的 map ,或包含不一致状态的 map 。为了安全起见,当 MyThread 线程每 30 秒更新一次时,您可能希望使用同步来防止线程读取 myData

换句话说,仅仅因为您只有一个给定类的实例并不一定意味着您不需要同步。您需要同步,因为您有多个线程(每个线程可能运行不同的代码)正在访问相同的数据。您可能可以允许数据的所有读取者同时访问数据,但在写入数据结构的操作期间确保独占访问。

关于java - 只有一个线程需要同步吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33041372/

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