Звучит так, будто вы ищете блокировку чтения-записи, к счастью, java предоставляет ее, ReentrantReadWriteLock
. Вы можете использовать его следующим образом:
class A {
private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
private Foo foo = new Foo();
Foo getFoo() {
lock.readLock().lock();
try {
Foo tmp = foo; //foo.clone()?
} finally {
lock.readLock().unlock();
}
return tmp;
}
void modifyFoo() {
lock.writeLock().lock();
try {
//modify this.foo
//...
} finally {
lock.writeLock().unlock();
}
}
}
Это позволит любому количеству потоков одновременно вызывать getFoo()
, но только одному вызову modifyFoo()
. Когда вызывается метод модификации foo, поток будет блокироваться до тех пор, пока не будут сняты все блокировки чтения, затем начнет выполняться и предотвратит получение любых новых блокировок чтения до тех пор, пока он не будет завершен. Есть еще проблемы параллелизма, так как возвращаемый Foo
может быть изменен кодом, который вызывает getFoo
, но это должно обеспечить базовый инструмент, который вам нужен.