繁体   English   中英

仅当相同的 object 作为方法中的参数传递时才锁定

[英]Lock only if same object is passed as a parameter in method

当多个线程尝试访问 fetchStudentList 方法时,如何实现锁定 java8?

条件就像

如果 StudentFilter 等于 object 通过应用锁,(在这种情况下一次一个线程)

同时允许其他 StudentFilter 对象通过

private List<Students> fetchStudentList(StudentFilter filter) {

  // if same filter object add lock
  // other filter objects can pass through

}


class StudentFilter {

 private final Set<String> divSets;

 public SmscFilter(Set<String> divSets) {
        this.divSets = divSets != null ? divSets : new HashSet<>();
    }

 // getters
 // equals and hashcode 
}

这可能取决于语言,但如果“相同的 StudentFilter 对象”是指完全相同的实例(即身份),则可以对其进行同步。 这样,一次只能对同一个过滤器进行一个调用:

private List<Students> fetchStudentList(StudentFilter filter) {
    synchronized(filter) {
        // logic
    }
}

如果“相同的 StudentFilter”是指相同的 object,那会有点棘手,但想法应该是相似的。 实现此目的的一种方法是使用来自过滤器的 map(假设它实现equals(Object)hashCode() )锁定 object:

ConcurrentMap<StudentFilter, Lock> locks = new ConcurrentHashMap<>();
private List<Students> fetchStudentList(StudentFilter filter) {
    Lock lock = locks.computeIfAbsent(filter, f -> new ReentrantLock());
    try {
        lock.lock();
        // logic
    } finally {
        lock.unlock();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM