Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java内存中数据存储线程安全_Java_Multithreading_Sqlite_Multiplayer - Fatal编程技术网

Java内存中数据存储线程安全

Java内存中数据存储线程安全,java,multithreading,sqlite,multiplayer,Java,Multithreading,Sqlite,Multiplayer,我正在用Java制作一个实时多人游戏服务器。我将匹配的所有数据存储在内存中,存储在带有“match”对象的HashMap中。每个match对象包含所有玩家的游戏和游戏状态信息(一场比赛中2-5人)。服务器将为每个用户到服务器的连接传递相同的匹配对象 我有点担心的是让这个线程安全。可以连接到服务器中的不同线程,所有线程都需要访问相同的匹配项 问题是对象中会有很多变量/列表,所有这些都需要同步。其中一些可能需要用于执行相互影响的计算,这意味着我需要嵌套的同步块,这是我不想要的 match对象中每个变

我正在用Java制作一个实时多人游戏服务器。我将匹配的所有数据存储在内存中,存储在带有“match”对象的HashMap中。每个match对象包含所有玩家的游戏和游戏状态信息(一场比赛中2-5人)。服务器将为每个用户到服务器的连接传递相同的匹配对象

我有点担心的是让这个线程安全。可以连接到服务器中的不同线程,所有线程都需要访问相同的匹配项

问题是对象中会有很多变量/列表,所有这些都需要同步。其中一些可能需要用于执行相互影响的计算,这意味着我需要嵌套的同步块,这是我不想要的

match对象中每个变量的同步块是我唯一的解决方案,还是我可以做其他事情

我知道SQLite具有内存模式,但我发现的问题是:

从他们的网站上引用:

SQLite支持无限数量的同时读卡器,但它在任何时刻都只允许一个编写器。在许多情况下,这不是问题。作家排队。每个应用程序都能快速地完成数据库工作并继续运行,并且锁定时间不会超过几十毫秒。但是有些应用程序需要更多的并发性,这些应用程序可能需要寻求不同的解决方案


几十毫秒?那是很长时间了。这是否足够快,或者是否有另一个内存数据库适合实时游戏?

这个问题非常普遍。很难给出具体的建议

我正在用Java制作一个实时多人游戏服务器。我将匹配的所有数据存储在内存中,存储在带有“match”对象的HashMap中

  • 如果要在映射中存储“匹配”对象,然后有多个线程请求/添加/删除映射中的对象,则必须使用“ConcurrentHashMap”
我有点担心的是让这个线程安全。可以连接到服务器中的不同线程,所有线程都需要访问相同的匹配项

  • 使用多线程最安全、最简单的方法是将每个“匹配”对象设置为不可变对象,这样就不需要进行同步

  • 如果“匹配”信息是可变的,并且由多个线程同时访问,那么您必须同步。但在这种情况下,“可变状态”包含在“匹配”中,因此只有类“匹配”需要使用同步

我需要嵌套的同步块,这是我不想要的

  • 我从未见过有嵌套同步块的需要。也许您应该在尝试使其线程安全之前重构您的解决方案
match对象中每个变量的同步块是我唯一的解决方案,还是我可以做其他事情?我知道SQLite有一个内存模式

如果有多个线程访问的状态可变的对象,则需要使它们成为线程安全的对象。没有其他方法(请注意,我没有说“同步块”是唯一的选项。有不同的方法来实现线程安全)。使用内存中数据库并不是解决线程安全问题的方法

使用内存中数据库的优势在于加快了对信息的访问(因为您不必使用存储在HDD中的信息访问常规数据库),但代价是您的应用程序现在需要更多的RAM。
顺便说一句,比使用内存数据库更快的是将您需要的所有信息保存在程序中的对象中(这与需要更多RAM的限制相同)。

这个问题非常普遍。很难给出具体的建议

我正在用Java制作一个实时多人游戏服务器。我将匹配的所有数据存储在内存中,存储在带有“match”对象的HashMap中

  • 如果要在映射中存储“匹配”对象,然后有多个线程请求/添加/删除映射中的对象,则必须使用“ConcurrentHashMap”
我有点担心的是让这个线程安全。可以连接到服务器中的不同线程,所有线程都需要访问相同的匹配项

  • 使用多线程最安全、最简单的方法是将每个“匹配”对象设置为不可变对象,这样就不需要进行同步

  • 如果“匹配”信息是可变的,并且由多个线程同时访问,那么您必须同步。但在这种情况下,“可变状态”包含在“匹配”中,因此只有类“匹配”需要使用同步

我需要嵌套的同步块,这是我不想要的

  • 我从未见过有嵌套同步块的需要。也许您应该在尝试使其线程安全之前重构您的解决方案
match对象中每个变量的同步块是我唯一的解决方案,还是我可以做其他事情?我知道SQLite有一个内存模式

如果有多个线程访问的状态可变的对象,则需要使它们成为线程安全的对象。没有其他方法(请注意,我没有说“同步块”是唯一的选项。有不同的方法来实现线程安全)。使用内存中数据库并不是解决线程安全问题的方法

使用内存中数据库的优势在于加快了对信息的访问(因为您不必使用存储在HDD中的信息访问常规数据库),但代价是您的应用程序现在需要更多的RAM。 顺便说一句,比使用内存数据库更快的是将您需要的所有信息保存在程序中的对象中(具有相同的
void clientScoredGoal(Client client) {
  actionQueue.put(new GoalScoredEvent(client));
}