仅在变量更新时才对变量进行同步

时间:2016-07-24 03:00:29

标签: java locking synchronized

用例:轮换数据存储的凭据

我想要的是什么:

  1. 当调用updateCredentials时,它将等待所有线程完成获取凭据(通过同步)以将凭据更新为新凭据。
  2. 我不希望调用doSomeQuery让对方等待获取凭据。这个对象可以在多个线程中使用,这是一个浪费的等待。
  3. 是否有方法/模式来实现这一目标?下面的代码示例实现了第1项,但没有实现第2项。

    private Object credentialUpdate = new Object();
    
    public void updateCredentials(String user, String pass) {
        synchronize(credentialUpdate) {
          this.user = user;
          this.pass = pass;
        }
    }
    
    public void doSomeQuery(String query) {
        String curUser;
        String curPass; 
        synchronize(credentialUpdate) {
            curUser = this.user;
            curPass;
        }
        // execute query
    }
    

1 个答案:

答案 0 :(得分:0)

使用java.util.concurrent.locks.ReadWriteLock及其实施ReentrantReadWriteLock。来自Javadoc

  

ReadWriteLock维护一对关联的锁,一个用于只读操作,另一个用于写入。只要没有写入器,读锁定可以由多个读取器线程同时保持。写锁是独占的。