Java中具有某些属性值的对象锁

时间:2019-02-12 14:13:41

标签: java multithreading concurrency

我只有一个物体

public class MyObject{
 private int id;
 private String source;
 private String entityId;
 private string value;

//setter getter

}

//使用中的方法

public syncronized void processCalc(MyObject o){
 //object processing code

}

在这里我使用了同步,因此只要有1个线程使用该方法,每当有外部线程调用它们时,它们都会等待

现在我需要将其更改为某些条件。 在某些情况下,应使用相同的方法进行同步和异步操作

如果具有source = ABC和entityId = 123的对象已在处理,并且即将到来的线程具有具有source = ABC和entityId = 333的对象,则它应允许不等待。如果来自diff线程的source = ABC和entityId = 123的同一对象,则应进入等待状态,直到第一个完成该过程。

所以我需要使相同的方法仅在满足某些条件时才被同步。

1) if Coming Object is same as object already processing, then it should wait
2) If coming object is diff than already processing object then it should allow to proccess at the same time, no need to wait
3) same object I mean entityid and source is same

注意:此处的值可以是diff,因此我们需要实现这种逻辑

1 个答案:

答案 0 :(得分:0)

我认为您需要在此处锁定对象本身

public  void processCalc(MyObject o){
 synchronized(o){
 //object processing code
}
}

下次值相同时不要创建新对象,仅当值不同时才创建新对象,我认为这将达到您的目的,因为每个对象只有一个锁。因此,下一次当值将相同且将传递相同的对象时,它将等待现有的锁被释放。在第二种情况下,当对象将不同时,它将不等待而继续进行操作。