首页 新闻 会员 周边

多线程 线程A创建的数据 线程B读取不到

0
悬赏园豆:20 [待解决问题]

我在多线程跑数据的时候,线程A创建了一条数据,线程B没读取到,导致线程B也创建了一条同样的数据。请问大佬们,这种情况咋解决

dckja的主页 dckja | 初学一级 | 园豆:19
提问于:2023-12-08 11:26
< >
分享
所有回答(6)
0

线程内创建的数据, 只有当前线程存在. 不知道你的业务场景, 你可以在线程外定义数据,然后加锁,线程内读取更新

百鸟朝凤 | 园豆:260 (菜鸟二级) | 2023-12-08 14:08

嗯 我今天处理成:在线程外定义了一个数组,加锁。然后在线程内查询需要的数据,set数组。最后在线程外去重批量插入落库

支持(0) 反对(0) dckja | 园豆:19 (初学一级) | 2023-12-08 22:49
0

InheritableThreadLocal 可以做到吧,如果使用线程池了,使用TransmittableThreadLocal

让我发会呆 | 园豆:2929 (老鸟四级) | 2023-12-08 14:18
0

同意一楼。

tea2007 | 园豆:1 (初学一级) | 2023-12-08 22:10
1

在多线程环境下,如果多个线程同时对共享资源进行读写操作,就可能发生竞态条件(Race Condition)。你描述的情况可能是因为线程A创建了数据,但在线程B开始读取之前,线程A的操作还没有对其他线程可见,导致线程B也执行了相同的创建操作。

有几种常见的方法可以解决这类问题:

加锁: 使用互斥锁(Mutex)来保护对共享资源的访问,确保同时只有一个线程可以对数据进行操作。这可以通过在关键代码段前后使用锁来实现。但要注意,过度使用锁可能会导致性能问题和死锁,因此需要小心谨慎地选择锁的范围。

使用原子操作: 在一些情况下,可以使用原子操作来保证对共享数据的操作是原子的,不会被中断。一些编程语言和平台提供了原子操作的支持,可以帮助避免竞态条件。

使用线程安全的数据结构: 使用线程安全的数据结构,如线程安全的队列(Thread-safe Queue)或其他线程安全的容器,可以简化并发编程,因为这些数据结构内部已经实现了适当的同步机制。

采用同步机制: 使用信号量、条件变量等同步机制来协调线程的执行顺序,确保在读取数据之前,必须等待创建数据的线程完成操作。

使用事务(对于数据库操作): 如果涉及到数据库操作,可以使用事务来确保一组操作的原子性,即要么全部成功,要么全部失败。

具体选择哪种方法取决于你的应用场景和具体需求。在多线程编程中,确保对共享资源的访问是线程安全的是至关重要的。

Technologyforgood | 园豆:5675 (大侠五级) | 2023-12-08 22:16
0

可以尝试定义一个安全的线程集合去判断

灬丶 | 园豆:2 (初学一级) | 2023-12-11 17:36
0

如果是Java的话,可以用ConcurrentMap这种集合类,支持多线程存取

子非鱼焉 | 园豆:220 (菜鸟二级) | 2023-12-14 17:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册