java - 即使是单线程的Java应用程序,在没有数据库的情况下,有时不会出现数据不一致的问题吗?

标签 java multithreading synchronization

在许多讨论同步的示例中,都提到了一些大意:“这将在单线程应用程序中工作,但如果是多线程应用程序......”

我很困惑,因为在我看来,即使在单线程操作中,也可能出现与多线程应用程序中提到的类似问题,尽管可能难以置信。

假设您有一个对象,它有一个状态字段,该字段反射(reflect)它是否已放入队列中。伪代码为:object.setStatus(INQUEUE); placeInQueue(对象);

现在,如果状态有可能成功设置,但下一行代码“默默地失败”并且程序继续,我们是否会遇到我们认为对象在队列中但实际上不在队列中的问题?也许我们可能会遭遇无声失败的想法是错误的。

但是,如果上述问题有可能发生,我们该如何使这两行代码要么总是同时执行,要么都失败?

最佳答案

逻辑错误,即算法中的缺陷,在单线程应用程序中仍然可能并且经常发生。如果算法的单线程实现中存在这样的问题,那么当尝试使其多线程时,情况只会变得更糟。

引用“这将在单线程应用程序中工作,但如果在多线程应用程序中......”正在谈论由并发本质引入的一类问题。例如,如果我在厨房里自己烤蛋糕,我就不用担心碰到另一个酋长。然而,我仍然不得不担心我的手在 toastr 上被烫伤,并且不会把我的臀部撞到柜台上。

您描述的使用由磁盘支持的队列的场景是并行性的另一个示例。即使我们的应用程序逻辑是单线程的,当我们的进程正在使用队列时,其他进程也可以写入磁盘,因此磁盘可能会耗尽空间,而这并不是我们的程序的错误。处理此类问题可能会变得相当复杂,两种基本方法是要么锁定资源一段时间,要么乐观地假设资源会成功,然后在稍后失败时处理错误。您给出的示例是后者的示例,只是没有错误处理。这种情况下的无声故障可能会发生在忽略该问题的真实系统中,并且它们会被破坏。

关于java - 即使是单线程的Java应用程序,在没有数据库的情况下,有时不会出现数据不一致的问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26055315/

相关文章:

synchronization - Nitrous IO 桌面不同步文件

linux - 自旋锁真的需要 DMB 吗?

java - 在线程的 run() 中捕获 OutofMemoryError 是否明智?

java - Java:两个线程同时对给定范围内的数字求和:当仅连接一个线程时,第二个线程的总和太大

java - 如果数组中多个值匹配,如何获取值的最后一个索引号?

java - 令人愉悦的调色板随机颜色生成

c++ - 为什么我无法编译这个简单的线程测试?

Java线程同步对象的等待和通知

java - “订单”实体 bean

java - 为什么这个 for 循环不循环多次?