黑马程序员技术交流社区

标题: java 多线程问题 [打印本页]

作者: 邵新瑜    时间: 2012-12-5 18:47
标题: java 多线程问题
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的。

请问会不会出项这样的情况。
如果会应该怎么去解决这样的同步问题呢?
作者: 怪盗急得    时间: 2012-12-5 19:06
本帖最后由 陈德基 于 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了。
作者: 王斌    时间: 2012-12-7 14:26
关于多线程这里确实有时候会出现这种神奇的事情,不过也可以避免的
同步可有两只表现形式:
同步代码块
同步函数
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);
}
}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2