繁体   English   中英

java方法同步与读写互斥

[英]java method synchronization and read/write mutual exclusion

我在一个类中有两个方法read()write()如下。

class Store
{

  public void write()
  {
    // write to store;
  }

  public string  read()
  {
    // read from store;
  }
}

1) Store对象是一个单例。

2)我有一个Writer类将写入商店和几个Reader类将同时从商店读取。

我的要求是,当作者向商店写信时,所有读者都应该等待。 即,当控制在write() ,所有对read()的调用都应该被阻止。 我如何实现这一目标? 我在write()方法中尝试过synchronize(Store.class) ,但似乎对我不起作用。

在这种情况下,最好的选择是使用读写锁: ReadWriteLock 它允许单个写入器,但允许多个并发读取器,因此它是此类场景的最有效机制。

一些示例代码:

class Store
{
    private ReadWriteLock rwlock = new ReentrantReadWriteLock();

    public void write()
    {
       rwlock.writeLock().lock();
       try {
          write to store;
       } finally {
          rwlock.writeLock().unlock();
       }
    }

    public String read()
    {
       rwlock.readLock().lock();
       try {
          read from store;
       } finally {
          rwlock.readLock().unlock();
       }
    }
}

synchronized是最简单的解决方案,因此您应该解释“对我来说似乎不起作用”的意思,并可能向我们展示您如何使用它。

更好的解决方案是使用ReentrantReadWriteLock,因为它也允许并发访问读者。

当某个对象上的方法同步时,执行此方法的线程会阻止所有其他线程尝试进入在同一对象上同步的另一个块/方法。

因此,如果您希望写入线程禁止任何读取线程读取,您必须同步写入和读取方法。 没有理由在Store类上进行同步。 Store对象上同步更自然:

public synchronized void write() {
  write to store;
}

public synchronized String read() {
  read from store;
}

然而,这(也许)有一个缺点:它也禁止两个读取器线程同时读取。 如果你真的需要这种情况发生,你应该使用ReadWriteLock 但这会导致代码性能下降,更难理解和维护。 如果我已经测量到需要这样做,我只会使用它。

使用 java.util.concurrent 包中的 ReadWriteLock

请注意阅读这篇文章:

https://blog.takipi.com/java-8-stampedlocks-vs-readwritelocks-and-synchronized/

  • RWLocks 可能很慢,尤其是当有很多读者到作者时
  • 同步平均是最可靠的快速
  • 有像 StampedLock 这样的新锁

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM