A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邵新瑜 中级黑马   /  2012-12-5 18:47  /  1323 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

2 个回复

正序浏览
关于多线程这里确实有时候会出现这种神奇的事情,不过也可以避免的
同步可有两只表现形式:
同步代码块
同步函数
Object  obj  = new  Object ();
synchronized(obj){
f(map.get(1).size<5){
     map.get(1).add(a);
   }
}

public  synchronized void show(){
if(map.get(1).size<5){
     map.get(1).add(a);
}
}
回复 使用道具 举报
本帖最后由 陈德基 于 2012-12-5 19:09 编辑

        
ConcurrentMap<Integer,AClass> map;(类AClass有个size属性)

if(map.get(1).size<5){
     map.get(1).add(a);
}

不知道是不是我记忆问题,你这个问题好像已经问过了。主要是添加锁的问题。
你可以添加同步代码块
synchronized(对象锁) 指定一个对象,如果嫌麻烦,可以直接使用java已经加载好的字节码对象,比如String.class
{
   if(map.get(1).size<5){
     map.get(1).add(a);
   }
}
如果要效率高点的话,在这个同步代码块的外围再添加一个判断AClass的size长度判断。

或者你可以使用同步函数
public synchronized void function()
{
     if(map.get(1).size<5){
     map.get(1).add(a);
     }
}
这样当两个线程要执行代码的时候,都会先判断锁,这样就不会出现你说的那种两个线程同时执行的情况,AClass的size属性也不会超过5了。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马