ConcurrentMap<Integer,AClass> map;(类AClass有个size属性)if(map.get(1).size<5){
     map.get(1).add(a);
}这样子的代码,我想问会不会出现一种情况某个AClass的size会大于等于5.因为我猜可能出现这样一种情况。
在线程A,B中,
线程A,map.get(1).size返回是4,而线程Bmap.get(1).size也是返回4.
然后线程A,B就可以执行add操作,此时map.get(1).size的size已经是6了。
但是我AClass是不能超过5的。请问会不会出项这样的情况。
如果会应该怎么去解决这样的同步问题呢?

解决方案 »

  1.   

    嗯,的确会出现这种线程同时add()冲突的情况。
    把冲突的代码用synchronized包起来:public void someMethod() {
         synchronized {
              if(map.get(1).size<5){
                   map.get(1).add(a);
              }
         }
    }这属于部分代码加锁。若两个线程都运行到synchronized代码段,则只能一个先运行,另一个等待;运行完了再由等待的线程运行该加锁块。这样就能避免出现线程冲突的情况。
      

  2.   

    不知道哪里加锁是么。。你直接synchronized(this){//需要同步操作的代码块}
      

  3.   

    以上。
    但是我使用的是ConcurrentMap。不是可以解决多线程问题么~
    如果不能,这个ConcurrentMap有神马用啊
      

  4.   

    ConcurrentMap是线程安全的,可以在多线程并发访问,不需要手动加锁
    LZ几位都在说啥那,别误导人PS:线程锁的问题,为什么不自己测试一下,几行代码就知道结果了
      

  5.   

    这位朋友,好像楼主是对ConcurrentMap中的一个元素做操作吧,难道AClass也是线程安全的?
      

  6.   

    ConcurrentMap线程安全是表示你对ConcurrentMap的操作是线程安全,但不代表ConcurrentMap中的元素也是线程安全的。我对线程也不是很了解。标准的解释我不会说,我的理解就是你上面的操作是针对map里面的一个元素做操作。map与AClass之间只是有一个引用的关系在,所以你操作AClass与map无关。可能说的不标准,见谅。
      

  7.   


    ConcurrentMap不能解决多个操作的原子访问问题
    不过ConcurrentMap有putIfAbsent方法,但是你的情况跟这个不一样
      

  8.   

    哦,是我疏忽了
    其实...LZ问的根本不是MAP的问题啊...给LZ绕晕了...
    LZ的map.get(1)的是一个List?
    这个List需要采用同步队列,可以考虑BlockingQueue,LinkedBlockingQueue或者ArrayBlockingQueue
      

  9.   

    那就是说我还要确保AClass是线程安全的,那么我的操作才会是线程安全的?
      

  10.   

    我就问一句,map和map.get(1)能是一个东西吗?