Multithreading 并发收集

Multithreading 并发收集,multithreading,grails,concurrency,groovy,java.util.concurrent,Multithreading,Grails,Concurrency,Groovy,Java.util.concurrent,我有一堆线程,每个线程创建了很多对象。创建每个对象时,我需要检查现有对象的集合,以确保其他线程尚未创建相同的对象。如果尚未创建相等的对象,则需要将刚刚创建的对象添加到现有对象列表中。所以基本上我需要列表中的互斥 我曾想过做这样的事情,但我不知道在Groovy中是否有更好的方法: import java.util.concurrent.locks.Lock import java.util.concurrent.locks.ReentrantLock class FooService {

我有一堆线程,每个线程创建了很多对象。创建每个对象时,我需要检查现有对象的集合,以确保其他线程尚未创建相同的对象。如果尚未创建相等的对象,则需要将刚刚创建的对象添加到现有对象列表中。所以基本上我需要列表中的互斥

我曾想过做这样的事情,但我不知道在Groovy中是否有更好的方法:

import java.util.concurrent.locks.Lock
import java.util.concurrent.locks.ReentrantLock

class FooService {

    private final ReentrantLock lock = new ReentrantLock()
    private def existingObjectList = []

    def longRunningProcess(params) {
        // create a bunch of threads that will all use someMethod
    }

    private def someMethod(def propertiesMap) {
        def obj = new Foo(propertiesMap) // create an object

        lock.lock() // lock the existing object list
        try {
            if(!existingObjectList.contains(obj)) {
                existingObjectList.add(obj)
            }
        } finally {
            lock.unlock() // unlock the existing object list
        }
    }
}

p.S.我认为这无关紧要,但这段代码在Grails服务中,我正在使用创建线程。

你看过了吗?@tim_yates我看过了,但是,通读他们的描述,看起来不像是一个线程在读操作之后立即拥有对写操作的独占访问权。在线程
A
有机会写入集合之前,我不能让线程
A
从集合中读取,也不能让线程
B
从集合中读取。有@tim_yates看起来很有希望!在我开始完整的互斥路由之前,我会尝试一下。因为我只需要一个列表而不是一个映射,所以我想我只需要使用我的对象作为键,并使用一个空字符串作为值(因为不允许使用
null
)?Apache似乎使用
ConcurrentHashMap
作为of
ConcurrentHashSet