我需要用用户名键化一个数据结构,然后在POJO中设置一些数据(额外的集合)。数据需要线程安全。
所以我在考虑主要的结构,ConcurrentHashMap<String, MyPOJO>。对于我需要在MyPOJO上执行的操作,我可以直接读取它,也可以对它执行写操作。
最好的方法是在映射中获取,然后在同步块中对MyPOJO进行操作吗?我假设我只需要在update方法中放置一个同步块,那么读取方法就会自动被阻塞吗?这是高并发应用程序中最好的方法吗?还是需要在get/set操作中使用类似于ReadWriteLock的操作?
如果我使用类似于StampedLock的东西,那么每个MyPOJO都需要一个正确的,这样我就可以进行记录级别锁定了吗?
谢谢!
发布于 2020-11-14 02:36:39
最好的方法是在地图上获取数据,然后在
synchronized块中对MyPOJO进行操作吗?
我假设您指的是MyPOJO实例本身上的一个MyPOJO块(或实例拥有的私有锁)。
如果你做得对,我的回答是肯定的。
我假设我只需要在update方法中放置一个
synchronized块,那么读取方法就会自动被阻塞吗?
不,那不对。访问或更新可变对象的所有方法都需要在同一锁上同步。
如果您不同步读和写,您将面临各种各样的线程安全问题,包括写的可见性问题。海生虫。
是高度并发应用程序中最好的方法吗?还是需要在get/set操作中使用类似于
ReadWriteLock的操作?
那得看情况。
关于ReadWriteLock问题:
MyPOJO实例上获得显著的锁争用,否则可能不值得对此进行优化。如果访问和更新方法只在相对较短的时间内保持锁,则会减少任何争用的影响。
更广泛地说,我怀疑您可能混淆了“高度并发”和“高度可伸缩性”。Java多线程只能在一台机器上执行最高限度的内核(和内存)。除此之外,通过巧妙的调整来提高并发性,你将一事无成。为了进一步扩展,您需要更改系统架构,以便由不同机器上的多个JVM实例处理请求。
所以..。总之,如果您对单个MyPOJO实例有重大争议,并且可能会对单个实例进行大量并行读取操作,那么.MyPOJO可能会有所帮助。
--如果我使用类似于
StampedLock的东西,每个MyPOJO都需要一个正确的,这样我就可以进行记录级别锁定了?
除非你有很大的争议,否则我怀疑是否会有很大的好处;见上文。但是是的,如果你在每个实例中使用一个StampedLock,你就会得到记录级的锁定.就像你会对每个实例进行锁定一样。
FWIW:这闻起来有点“过早优化”的味道。此外,如果您预期您的解决方案在短期到中期内需要扩展到单个JVM之外,那么过度优化单个JVM解决方案无疑是浪费时间。
https://stackoverflow.com/questions/64830254
复制相似问题