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的。请问会不会出项这样的情况。
如果会应该怎么去解决这样的同步问题呢?
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的。请问会不会出项这样的情况。
如果会应该怎么去解决这样的同步问题呢?
解决方案 »
- ssh2整合
- 关于添加功能的约束
- 菜鸟~求教 一个关于查询结果回传循环输出的问题
- 超多JAVA,DotNet视频共享 [希望能置顶让更多朋友下载到]
- 再一次为灾区祈祷.........以程序员的方式.............
- 为什么在struts中使用ajax,返回的字符串,带html标签的不能解析呢?
- WEB容器怎么样承载同时在线人数几千人!怎么优化?在线给分!
- 各位知道不知道那里有将EJB 3.0规范的书?
- 我对我的jb做了以下修改之后,servlet不能用了
- 学JAVA要求英文水平很高吗?
- 如何将excel文件数据导入到mysql数据库里,求帮助,谢谢
- public InvocationTargetException(Throwable target)
把冲突的代码用synchronized包起来:public void someMethod() {
synchronized {
if(map.get(1).size<5){
map.get(1).add(a);
}
}
}这属于部分代码加锁。若两个线程都运行到synchronized代码段,则只能一个先运行,另一个等待;运行完了再由等待的线程运行该加锁块。这样就能避免出现线程冲突的情况。
但是我使用的是ConcurrentMap。不是可以解决多线程问题么~
如果不能,这个ConcurrentMap有神马用啊
LZ几位都在说啥那,别误导人PS:线程锁的问题,为什么不自己测试一下,几行代码就知道结果了
ConcurrentMap不能解决多个操作的原子访问问题
不过ConcurrentMap有putIfAbsent方法,但是你的情况跟这个不一样
其实...LZ问的根本不是MAP的问题啊...给LZ绕晕了...
LZ的map.get(1)的是一个List?
这个List需要采用同步队列,可以考虑BlockingQueue,LinkedBlockingQueue或者ArrayBlockingQueue