【问题标题】:Race condition between two threads involving database update and reads涉及数据库更新和读取的两个线程之间的竞争条件
【发布时间】:2022-01-01 03:23:08
【问题描述】:

考虑一种情况:

List = get_list_by_key(key) //get from redis
if(list.size() != 0)
{
  //do something
} else 
{
  add_to_list(key, value) //put to redis
}

我面临的问题是当两个同时线程进来时,当列表为空时,(我不能等待另一个线程启动,这可能永远不会),有什么好的方法来处理这个?

理想情况下,如果块应该被执行,但在上述情况下它不会。

编辑:此代码是在集群环境中运行的应用程序的一部分,因此可能无法进行同步,在我的情况下,锁也不可行,因为它会阻塞另一个线程(我正在尝试避免)。

【问题讨论】:

  • 听起来整个块应该是synchronized(或使用其他一些锁定机制),因此一次只有一个线程可以运行整个代码块。
  • 因此可能无法同步:也许您可以使用distributed lock
  • 如果您谈论的是集群环境,我猜您并不是真正关心多线程,而是更多关于访问同一个 Redis 的多个进程和服务。我建议根据您的用例调查事务和乐观锁或悲观锁。如果您使用框架来访问 Redis,这可能会为您提供一种使请求具有事务性的简单方法。
  • 您可以使用Lua script 使代码原子化。

标签: java database multithreading redis


【解决方案1】:

使用同步锁定整个事物,一个线程将一次访问该部分,从 redis 获取,更新,再次保存在 redis 中。

public synchronized void doStuff (String key, String value) {
  List = get_list_by_key(key) //get from redis
  if(list.size() != 0) {
    //do something
  } else {
  add_to_list(key, value) //put to redis
  }
}

【讨论】:

    猜你喜欢
    • 2012-11-17
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 2016-02-02
    相关资源
    最近更新 更多