多线程锁的问题

09-12-11 xysniper

需求:有两个方法:put()与get(),多个线程都会调用put和get,要求put与get同步,put自己也要同步

问题:请问使用ReentrantReadWriteLock可以解决吗?

         

banq
2009-12-11 13:11

可以,当然前提是put操作一般并发可能性小,主要以读为主。

xysniper
2009-12-11 15:03

其实,我的意思是说方法A和B同步,A还要和C同步,能实现吗?如下的代码是否会有问题?

如果C方法同步对的话,那么B和C相当于用同一个WL锁,岂不是执行B时,C要等,执行C时B要等,如何做到B和C异步?

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();
  }

/**
 * 这里的实现对吗?
 */
  public void C() {
    wl.lock();
     ...
    wl.unlock();
  }

}
<p>

[该贴被xysniper于2009-12-11 15:54修改过]

banq
2009-12-11 17:49

如果想实现异步,就是在两者之前引入Queue,如果你想B和C异步,就两者之间引入Queue,如这个帖子代码:

http://www.jdon.com/jivejdon/thread/37820#23126255

xysniper
2009-12-11 21:38

To banq

可能我没有说清楚问题,

需求:有一个队列,里面是一些用户号码信息,其中包含多个相同的号码,但入库时只保留最近一个号码,其余号码不入库,多个线程不断地从此队列中拿出数据,查库后,如果此号码没有在表中,就得插入到insertList中,如果有就插入到updateList,最后判断如果这两个list的size大于一个数,就执行batchInsert and batchUpdate到数据库。

问题:为了访止库中插入重复用户号码,需要在查询库操作和入库操作之间同步;为了访止队列中重复的号码被提交到数据库,需要使用map储存,过滤掉旧的相同号码。

程序清单:见下面

[该贴被xysniper于2009-12-12 11:06修改过]

5Go 1 2 3 4 ... 5 下一页