我刚刚开始使用Java进行多线程,并且我意识到我在多线程环境中对对象访问和修改所采用的几种方法并不可靠。
例如,我有一个这样包装的钥匙:
class KeyBean {
private String key; // The key to be retrieved goes here
private long timestamp; // UNIX-based timestamp
public String getKey() {
// is key available? - yes
// update timestamp
// return key;
// is key available - no
// return null
}
public Boolean isKeyAvailable() {
// xxx seconds have passed
// return true
// else
// return false
}
然后我有一个管理类,该类将所有可能的关键对象存储在列表中
class KeyManager {
private List<String> keys; // The key to be retrieved goes here
public String getNextAvailableKey() {
// iterate list until available key is found
// return key;
}
}
想法是将向管理对象请求密钥。收到请求后,它将遍历键列表(而不是长列表。最多20个)。
一旦找到可用密钥,它将被返回给发出请求的对象。
在单个线程上这很好用,但是在我使用多线程的环境中,有一些实例,其中遍历该键列表的两个线程可能同时访问一个键对象,从而导致该键的多次使用这不是故意的。
因此,我只是想知道在访问对象时立即“锁定”对对象的最佳方法是什么,以便只有一个线程可以使用它。理想的解决方案是允许其他线程越过该对象并继续搜索其他键,并且一旦使用了该特定键,它将被释放回池中以供下一个线程访问。
不幸的是,在这种情况下,我不确定该解决方案使用的是什么术语,所以我想问我希望得到一些指导。