public class Test extends Thread {
private static final ReentrantReadWriteLock rrwl = new ReentrantReadWriteLock();
private final Lock rl = rrwl.readLock();
private final Lock wl = rrwl.writeLock();
public static void main(String[] args) {
new Test().start();
new Test().start();
new Test().start();
new Test().start();
new Test().start();
new Test().start();
}
public void A() {
rl.lock();
...
rl.unlock();
}
public void B() {
wl.lock();
...
wl.unlock();
}
/**
* 这里的实现对吗?
*/
publicvoid C() {
wl.lock();
...
wl.unlock();
}
}
<p class="indent">
To banq 可能我没有说清楚问题, 需求:有一个队列,里面是一些用户号码信息,其中包含多个相同的号码,但入库时只保留最近一个号码,其余号码不入库,多个线程不断地从此队列中拿出数据,查库后,如果此号码没有在表中,就得插入到insertList中,如果有就插入到updateList,最后判断如果这两个list的size大于一个数,就执行batchInsert and batchUpdate到数据库。 问题:为了访止库中插入重复用户号码,需要在查询库操作和入库操作之间同步;为了访止队列中重复的号码被提交到数据库,需要使用map储存,过滤掉旧的相同号码。 程序清单:见下面
为什么,readLock和writeLock本身是互斥的呀,读的时候不能写,写的时候不能读。如果入库时,再一个个拿出来去查数据库,那就更慢了,因为我发现,testDao.getUser(uservo.getMsisdn())很慢,查询一次比批量插入5000还要慢呀(msisdn已经设了索引),请参见 user表: user_id 主键,这里没有用 msisdn mobile number name user name usertype user type userscptype user scp type userstat user state updatedate profile date ...... 如果把msisdn设为唯一键,那么就会有很多无效的数据被提交到数据库,造成无畏的时间浪费和性能浪费,所以我的想法是在前面就把无用数据过滤掉,保证到数据库时都是有效需要入库的