在一个类中迭代arraylist,同时在其他类中添加元素

时间:2016-05-22 19:25:54

标签: java arraylist

我得到并发修改异常,问题是我在遍历arrayList并绘制和更新arraylist中的精灵,同时在另一个java类中添加新的精灵。

  File "test.py", line 14, in <module>
    cpp_args=['-E', r'-Iutils/fake_libc_include'])
  File "/usr/lib/python2.7/site-packages/pycparser/__init__.py", line 93, in parse_file
    return parser.parse(text, filename)
  File "/usr/lib/python2.7/site-packages/pycparser/c_parser.py", line 146, in parse
    debug=debuglevel)
  File "/usr/lib/python2.7/site-packages/ply/yacc.py", line 265, in parse
    return self.parseopt_notrack(input,lexer,debug,tracking,tokenfunc)
  File "/usr/lib/python2.7/site-packages/ply/yacc.py", line 1047, in parseopt_notrack
    tok = self.errorfunc(errtoken)
  File "/usr/lib/python2.7/site-packages/pycparser/c_parser.py", line 1680, in p_error
    column=self.clex.find_tok_column(p)))
  File "/usr/lib/python2.7/site-packages/pycparser/plyparser.py", line 55, in
_parse_error
    raise ParseError("%s: %s" % (coord, msg))

/usr/include/bits/byteswap.h:46:1: before: {

所以这些是名为Scene.java

的java类中的迭代方法
      (((x) & 0x0000ff00) <<  8) | (((x) & 0x000000ff) << 24))

#ifdef __GNUC__
# if __GNUC_PREREQ (4, 3)
static __inline unsigned int
__bswap_32 (unsigned int __bsx)
{
  return __builtin_bswap32 (__bsx);
}
# elif __GNUC__ >= 2
#  if __WORDSIZE == 64 || (defined __i486__ || defined __pentium__            \
                           || defined __pentiumpro__ || defined __pentium4__  \
                           || defined __k8__ || defined __athlon__            \
                           || defined __k6__ || defined __nocona__            \
                           || defined __core2__ || defined __geode__          \
                           || defined __amdfam10__)

这是将Firebolt(精灵)添加到场景中的精灵arraylist中的代码

2 个答案:

答案 0 :(得分:2)

  

我得到一个并发修改异常,问题是我正在遍历一个arrayList并绘制和更新arraylist中的sprite,同时在另一个java类中添加新的sprite。

基本解决方案非常简单:不要这样做。这是一个有意的设计特性,如果ArrayList在结构上被修改,那么在修改之前获得的那个列表上的任何迭代器都是无效的;进一步使用它们会导致ConcurrentModificationException被抛出。无论您是直接使用Iterator,使用增强型for循环还是使用forEach(),都会发生这种情况。其他基本集合类(LinkedListHashSet等)都以相同的方式工作。

如果确实你必须容纳正在修改的集合而不破坏正在进行的迭代,那么你需要一个容纳这种活动的集合类。例如,您可以考虑ConcurrentLinkedDequejava.util.concurrent中的其他一个集合。可以编写自己的,但这很棘手,为什么标准库中存在将要提供的类?

另请注意,虽然可以在java.util.concurrent中找到解决方案,但问题不在于涉及多个线程。事实上,如果你有多个线程,那么使用其中一个并发集合有两个目的:它还确保集合上的一致操作,而无需外部同步。如果您以前从多个线程访问该列表而没有正确同步,那么获得CME是一个幸运的突破 - 您可能只是刚刚发生了无声的故障。

答案 1 :(得分:0)

查看现有的线程安全类,例如ArrayBlockingQueue。您可以将ArrayList包装在同步代码中,但是使用已经完成所需操作的数据结构会更容易。