多线程锁的问题
需求:有两个方法:put()与get(),多个线程都会调用put和get,要求put与get同步,put自己也要同步
问题:请问使用ReentrantReadWriteLock可以解决吗?
需求:有两个方法:put()与get(),多个线程都会调用put和get,要求put与get同步,put自己也要同步
问题:请问使用ReentrantReadWriteLock可以解决吗?
可以,当然前提是put操作一般并发可能性小,主要以读为主。
其实,我的意思是说方法A和B同步,A还要和C同步,能实现吗?如下的代码是否会有问题?
如果C方法同步对的话,那么B和C相当于用同一个WL锁,岂不是执行B时,C要等,执行C时B要等,如何做到B和C异步?
|
如果想实现异步,就是在两者之前引入Queue,如果你想B和C异步,就两者之间引入Queue,如这个帖子代码:
http://www.jdon.com/jivejdon/thread/37820#23126255
To banq
可能我没有说清楚问题,
需求:有一个队列,里面是一些用户号码信息,其中包含多个相同的号码,但入库时只保留最近一个号码,其余号码不入库,多个线程不断地从此队列中拿出数据,查库后,如果此号码没有在表中,就得插入到insertList中,如果有就插入到updateList,最后判断如果这两个list的size大于一个数,就执行batchInsert and batchUpdate到数据库。
问题:为了访止库中插入重复用户号码,需要在查询库操作和入库操作之间同步;为了访止队列中重复的号码被提交到数据库,需要使用map储存,过滤掉旧的相同号码。
程序清单:见下面
[该贴被xysniper于2009-12-12 11:06修改过]
程序清单:
|
请banq和各位看看,我这个需求使用读写锁是否合理,其实上我要不断地读取数据库(即代码testDao.getUser(uservo.getMsisdn()))将数据分发到两个List中去,还要不断要将List中的数据插入或更新到数据库中,读数据库相当于read操作,存库相当于write操作,read和write操作都很频繁,但是因为我insertList和updateList中的数只有达到一定数量时才批量入库,所以我想让多个线程同时读,相当于读要并发,这样快些,因此使用ReentrantReadWriteLock的read锁,而入库使用ReentrantReadWriteLock的write锁,防止write和read冲突
|
insToDb()似乎应该这样写:
|
为了不影响当前对List操作性能,上面batchInsert可以放到另外一台机器运行,如果是双核4G,可以搞两个JVM,让另外一个JVM运行,分担负载。
[该贴被banq于2009-12-12 11:39修改过]
嗯,是我发贴发错了,程序原本是这样的:
|
你这个数据表共享资源和List共享资源是两个不同性质,读写锁只能锁定一个共享资源,就是List这个共享资源,凡是和List共享资源无关的都没用。
象你现在放在里面,只会拖延List的写锁时间,导致读比较忙。
数据表共享资源由数据库锁或事务来实现。
如果能这样,最好了,但是公司不会采用这么复杂的部署及设计,他们要考虑业务变化性及公司成本,还有将来的维护,部署复杂意味着将来维护难呀
这里锁住没有效果,在你再次入库时还需要检查一下,或者设定唯一键,从数据库方面想办法。
大致看了一下,你应该是想节省数据库操作,想自己实现一个唯一键+定时批量插入,我觉得也许你考虑得太多了,就像ban说的数据库上面弄个唯一就好了,也不需要考虑数据量到达某个数量时才插入,这会带来很多问题,你说的线程是一个,还有如果你的insertList现在size是4000,还没到达5000没有插入到数据库,服务器重启了怎么办,4000个还没插入的数据难道还要自己再实现一个持久化?对于数据库,我的领悟是,宁可执行100条简单语句,也不执行1条复杂语句