猿问

Java同步取决于方法参数

如何在方法参数值上提供同步?


使用“相同”参数值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调用。


陪伴而非守候
浏览 257回答 3
3回答

慕姐4208626

池化并可能重用的对象不应用于同步。如果是这样,它可能导致无关的线程因无用的堆栈跟踪而死锁。具体而言,String文字,和盒装基元如Integers应NOT来,因为它们合并并重复使用作为锁定对象。这个故事是更糟糕的Boolean对象,因为只有两个实例Boolean,Boolean.TRUE并且Boolean.FALSE每一个使用Boolean类将参照两个中的一个。我阅读了有关锁定对象的信息,但不确定如何适合我的情况。在顶层,我想管理对执行关键代码的应用程序的特定REST调用。您的数据库将照顾并发写入和其他事务性问题。您需要做的就是使用事务。

慕村225694

问题是您根本不应该在值上进行同步(例如,字符串或Integer对象)。含义:您将需要在此处定义一些特殊的EntityId类,当然,所有使用相同ID的“数据”都将需要使用相同的EntityId对象。
随时随地看视频慕课网APP

相关分类

Java
我要回答