Hi all, I'm getting an exception very infrequently when calling CAS.getJCas():
java.lang.ArrayIndexOutOfBoundsException at java.lang.System.arraycopy(Native Method) at java.util.ArrayList.ensureCapacity(ArrayList.java:171) at java.util.ArrayList.add(ArrayList.java:352) at org.apache.uima.jcas.impl.JCasImpl.<init>(JCasImpl.java:531) at org.apache.uima.jcas.impl.JCasImpl.getJCas(JCasImpl.java:498) at org.apache.uima.cas.impl.CASImpl.getJCas(CASImpl.java:2460) at com.mg.dgs.UimaPipeline.execute(UimaPipeline.java:88) at com.mg.dgs.DpsWork.execute(DpsWork.java:29) at com.mg.job.Task.execute(Task.java:103) at com.mg.job.impl.local.LocalTaskEntry.execute(LocalTaskEntry.java:48) at com.mg.job.impl.local.LocalComputeSpace$Worker.iteration(LocalComputeSpace.java:269) at com.mg.util.DaemonRunnable.run(DaemonRunnable.java:92) at java.lang.Thread.run(Thread.java:595) I looked into it a little, and it looks like it could be a race condition. I am running a handful of threads through this code "simultaneously", so it's likely. The JCasImpl class contains a static Collection variable (builtInsWithNoJCas) which is checked and -- if empty -- initialized. So my assumption is that this is a lazy instantion by the first instance in its initializer block. It's possible for two very closely created JCasImpl instances to both pass the check (builtInsWithNoJCas.size() == 0) and both try to populate the list. ensureCapacity (in ArrayList) has a couple of checks that could potentially lead to a race condition. This is all just guessing, however. Is there any reason that the check for an empty builtInsWithNoJCas can't be in a synchronized block or instantiated in a static block. Thanks, Kirk
