我正在读这个: http://tutorials.jenkov.com/java-concurrency/read-write-locks.html
在本教程中,为了编写重入读锁定,使用了以下代码
public class ReadWriteLock{
private Map<Thread, Integer> readingThreads =
new HashMap<Thread, Integer>();
private int writers = 0;
private int writeRequests = 0;
public synchronized void lockRead() throws InterruptedException{
Thread callingThread = Thread.currentThread();
while(! canGrantReadAccess(callingThread)){
wait();
}
readingThreads.put(callingThread,
(getAccessCount(callingThread) + 1));
}
public synchronized void unlockRead(){
Thread callingThread = Thread.currentThread();
int accessCount = getAccessCount(callingThread);
if(accessCount == 1){ readingThreads.remove(callingThread); }
else { readingThreads.put(callingThread, (accessCount -1)); }
notifyAll();
}
private boolean canGrantReadAccess(Thread callingThread){
if(writers > 0) return false;
if(isReader(callingThread) return true;
if(writeRequests > 0) return false;
return true;
}
private int getReadAccessCount(Thread callingThread){
Integer accessCount = readingThreads.get(callingThread);
if(accessCount == null) return 0;
return accessCount.intValue();
}
private boolean isReader(Thread callingThread){
return readingThreads.get(callingThread) != null;
}
}
所以我有疑问,我可以像这样使用hashmap吗
private Map<Thread, Integer> readingThreads =
new HashMap<Thread, Integer>();
我检查了Thread类代码,检查它是否覆盖了equals和hashcode 并发现它没有。 所以它将是defaut equals和hashcode。 所以所有人都会指向相同的桶?
任何人都可以帮助我了解它将如何映射到存储桶。 另外,程序员需要使用线程对象作为hashmap的关键字吗?
答案 0 :(得分:2)
所以所有人都指向相同的桶?
没有。在java中,每个类(包括Thread
)都隐含地从Object
类扩展。从equals
类扩展的hashCode
和Object
方法足以使Thread
个对象分布在不同的存储区中。
请参阅Object.equals
的文档:
类Object的equals方法实现最具辨别力 对象可能的等价关系;也就是说,对于任何非null 引用值x和y,当且仅当x时,此方法返回true 和y引用相同的对象(x == y的值为true)。
尽可能合理实用,由hashCode方法定义 class Object确实为不同的对象返回不同的整数。