黑马程序员技术交流社区
标题:
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