Java类允许多个线程读取或同时修改一个

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(),
  • 一旦线程想要修改foo,就不会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,但这应该提供您需要的基本工具.