Sol*_*Sun 8 java multithreading synchronization
假设您有以下课程:
class A {
private Foo foo = new Foo();
Foo getFoo() {
return foo; //foo.clone()?
}
void modifyFoo() {
//modify this.foo
//...
}
}
Run Code Online (Sandbox Code Playgroud)
我想允许:
getFoo()modifyFoo(),getFoo()执行其后的其他新调用,直到修改完成.Java中是否存在针对此问题的类,或者我是否必须实现它?如果我必须实现它,那么我该如何实现它以确保线程安全?
non*_*unk 13
听起来你正在寻找的是一个读写锁,幸运的是,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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这将允许任意数量的线程getFoo()同时调用,但只允许调用一个modifyFoo().当调用foo时,线程将阻塞直到释放所有读锁,然后开始执行并阻止获取任何新的读锁,直到它完成为止.仍然需要考虑并发问题,因为返回的内容Foo可以被调用的代码修改getFoo,但这应该提供您需要的基本工具.