R*********o 发帖数: 33 | 1 前两天面试。
模拟一个银行账户,有get(key)和put(key, value)两个method,怎么implement。
我随口说hashmap,然后他说要实现多线程,我就说用synchronize。但是如果只
synchronize put的话,也不是线程安全的。这样一个thread用put,另一个thread可以
get,所以我说同时synchronize get和put,用synchronize block。但是他说如果
synchronize both get and put,这样效率低下,这样如果是不同的key,其实不会影
响。他要求对于相同的key synchronize,不同的key不同的线程可以同时调用get和put
method,我就傻逼了,这个不晓得怎么弄。
反正最后折腾半天他说只lock buncket arrayList,然后两个线程不能同时put value
,但是两个线程可以同时hashCode(),我也就点头过去了。。。。
我想请问版上大神,这个lock buncket arrayList要怎么操作,这个怎么就能实现他说
的这个功能了? | z*******3 发帖数: 13709 | | l*******g 发帖数: 82 | 3 把数据结构改成更细小粒度。然后sync。
HashMap accounts;
public void put(acctId, money) {
Account acct = accounts.get(acctId);
synchronize(acct) {
...
}
}
前两天面试。模拟一个银行账户,有get(key)和put(key, value)两个method,怎么
implement。我随口说hashmap,然后他说要实现多线程,我就说用........
【在 R*********o 的大作中提到】 : 前两天面试。 : 模拟一个银行账户,有get(key)和put(key, value)两个method,怎么implement。 : 我随口说hashmap,然后他说要实现多线程,我就说用synchronize。但是如果只 : synchronize put的话,也不是线程安全的。这样一个thread用put,另一个thread可以 : get,所以我说同时synchronize get和put,用synchronize block。但是他说如果 : synchronize both get and put,这样效率低下,这样如果是不同的key,其实不会影 : 响。他要求对于相同的key synchronize,不同的key不同的线程可以同时调用get和put : method,我就傻逼了,这个不晓得怎么弄。 : 反正最后折腾半天他说只lock buncket arrayList,然后两个线程不能同时put value : ,但是两个线程可以同时hashCode(),我也就点头过去了。。。。
|
|