为了账号安全,请及时绑定邮箱和手机立即绑定

Java同步取决于方法参数

Java同步取决于方法参数

陪伴而非守候 2021-05-06 14:13:37
如何在方法参数值上提供同步?使用“相同”参数值A的所有方法调用都应该同步。即使使用A的调用已经在等待,具有不同参数值的方法调用(例如B)也可以访问。B的下一个并发调用还必须等待第一个B被释放。我的用例:我想在ID级别上同步对JPA实体的访问,但要避免悲观锁定,因为我需要某种队列。用于锁定的“键”旨在作为实体ID-实际上是Java Long类型。protected void entityLockedAccess(SomeEntity myEntity) {    //getId() returns different Long objects so the lock does not work    synchronized (myEntity.getId()) {        //the critical section ...    }}我阅读了有关锁定对象的信息,但不确定如何适合我的情况。在顶层,我想管理对执行关键代码的应用程序的特定REST调用。
查看完整描述

3 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

池化并可能重用的对象不应用于同步。如果是这样,它可能导致无关的线程因无用的堆栈跟踪而死锁。

具体而言,String文字,和盒装基元如IntegersNOT来,因为它们合并并重复使用作为锁定对象。

这个故事是更糟糕的Boolean对象,因为只有两个实例BooleanBoolean.TRUE并且Boolean.FALSE每一个使用Boolean类将参照两个中的一个。

我阅读了有关锁定对象的信息,但不确定如何适合我的情况。在顶层,我想管理对执行关键代码的应用程序的特定REST调用。

您的数据库将照顾并发写入和其他事务性问题。您需要做的就是使用事务。


查看完整回答
反对 回复 2021-05-19
?
慕村225694

TA贡献1880条经验 获得超4个赞

问题是您根本不应该在值上进行同步(例如,字符串或Integer对象)。

含义:您将需要在此处定义一些特殊的EntityId类,当然,所有使用相同ID的“数据”都将需要使用相同的EntityId对象。


查看完整回答
反对 回复 2021-05-19
  • 3 回答
  • 0 关注
  • 256 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信