私はたくさんのスレッドを持っており、それぞれが多くのオブジェクトを作成しています。各オブジェクトが作成されるたびに、既存のオブジェクトのコレクションをチェックして、別のスレッドによって同等のオブジェクトがまだ作成されていないことを確認する必要があります。同等のオブジェクトがまだ作成されていない場合は、作成されたばかりのオブジェクトを既存のオブジェクトのリストに追加する必要があります。基本的に、リストにミューテックスが必要です。
私はこのようなことを考えていましたが、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
}
}
}
PS 問題になるとは思いませんが、このコードはGrailsサービスにあり、Grails Executorプラグインを使用してスレッドを作成しています。