2016-07-24 86 views
0

USECASE变量:旋转凭证的数据存储区同步的,只有当它被更新

我想要什么:

  1. 当updateCredentials被调用时,它会等待,直到所有线程完成获取证书(通过同步)将凭证更新为新凭证。
  2. 我不想要调用doSomeQuery使对方等待获取凭证。这个对象可以在多个线程中使用,而且浪费了等待时间。

有没有一种方法/模式来实现这一目标?下面的代码示例实现了第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 
} 
+0

我不明白你的第二点,既不是你的doSomeQueryMethod()。你能更准确地解释你的目标是什么(你想要的是什么,而不仅仅是你不想要的)。 – davidxxx

回答

0

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

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