Yes, you will want to exercise some control over concurrency here: https://jena.apache.org/documentation/notes/concurrency-howto.html
--- A. Soroka The University of Virginia Library > On Apr 11, 2017, at 1:16 PM, Joshua TAYLOR <joshuaaa...@gmail.com> wrote: > > I expect the answer to my question is simply "make sure model access > is synchronized", but just in case, I'm wondering whether this is > expected behavior. Here's some code that modifies a model from a > bunch of different threads. This doesn't cause an error every time, > but occasionally throws, as shown in the stacktrace following the > code. > > The class here is called OhDearTest, because I getting a > `jena.shared.BrokenException oh dear, already have a slot for ...` > earlier, which I'm still trying to reproduce. This code doesn't seem > to trigger it. I've included a bit of that stacktrace at the very end. > > ## Code > > import org.apache.jena.rdf.model.Model; > import org.apache.jena.rdf.model.ModelFactory; > import org.apache.jena.rdf.model.Property; > import org.apache.jena.rdf.model.Resource; > > public class OhDearTest { > public static void main(String[] args) throws InterruptedException { > int n = 1000; > Model model = ModelFactory.createDefaultModel(); > Property p = model.createProperty("urn:ex:p"); > Thread[] thread = new Thread[n]; > for (int i = 0; i < n; i++) { > thread[i] = new Thread(() -> { > Resource r = model.createResource(); > r.addLiteral(p, "value"); > }); > thread[i].start(); > } > for (int i = 0; i < n; i++) { > thread[i].join(); > } > } > } > > ## Stacktrace > > Exception in thread "Thread-300" Exception in thread "Thread-299" > Exception in thread "Thread-304" Exception in thread "Thread-282" > Exception in thread "Thread-324" Exception in thread "Thread-331" > Exception in thread "Thread-328" > java.lang.ArrayIndexOutOfBoundsException: 905 > at org.apache.jena.mem.HashCommon.findSlot(HashCommon.java:164) > at > org.apache.jena.mem.HashedTripleBunch.contains(HashedTripleBunch.java:40) > at org.apache.jena.mem.NodeToTriplesMapMem.add(NodeToTriplesMapMem.java:52) > at > org.apache.jena.mem.GraphTripleStoreBase.add(GraphTripleStoreBase.java:63) > at org.apache.jena.mem.GraphMem.performAdd(GraphMem.java:37) > at org.apache.jena.graph.impl.GraphBase.add(GraphBase.java:181) > at org.apache.jena.rdf.model.impl.ModelCom.add(ModelCom.java:1191) > at > org.apache.jena.rdf.model.impl.ResourceImpl.addLiteral(ResourceImpl.java:285) > at OhDearTest.lambda$0(OhDearTest.java:15) > at java.lang.Thread.run(Thread.java:745) > java.lang.ArrayIndexOutOfBoundsException: 789 > at org.apache.jena.mem.HashCommon.findSlot(HashCommon.java:164) > at > org.apache.jena.mem.HashedTripleBunch.contains(HashedTripleBunch.java:40) > at org.apache.jena.mem.NodeToTriplesMapMem.add(NodeToTriplesMapMem.java:52) > at > org.apache.jena.mem.GraphTripleStoreBase.add(GraphTripleStoreBase.java:63) > at org.apache.jena.mem.GraphMem.performAdd(GraphMem.java:37) > at org.apache.jena.graph.impl.GraphBase.add(GraphBase.java:181) > at org.apache.jena.rdf.model.impl.ModelCom.add(ModelCom.java:1191) > at > org.apache.jena.rdf.model.impl.ResourceImpl.addLiteral(ResourceImpl.java:285) > at OhDearTest.lambda$0(OhDearTest.java:15) > at java.lang.Thread.run(Thread.java:745) > java.lang.ArrayIndexOutOfBoundsException: 827 > at org.apache.jena.mem.HashCommon.findSlot(HashCommon.java:164) > at > org.apache.jena.mem.HashedTripleBunch.contains(HashedTripleBunch.java:40) > at org.apache.jena.mem.NodeToTriplesMapMem.add(NodeToTriplesMapMem.java:52) > at > org.apache.jena.mem.GraphTripleStoreBase.add(GraphTripleStoreBase.java:63) > at org.apache.jena.mem.GraphMem.performAdd(GraphMem.java:37) > at org.apache.jena.graph.impl.GraphBase.add(GraphBase.java:181) > at org.apache.jena.rdf.model.impl.ModelCom.add(ModelCom.java:1191) > at > org.apache.jena.rdf.model.impl.ResourceImpl.addLiteral(ResourceImpl.java:285) > at OhDearTest.lambda$0(OhDearTest.java:15) > at java.lang.Thread.run(Thread.java:745) > java.lang.ArrayIndexOutOfBoundsException: 1061 > at org.apache.jena.mem.HashCommon.findSlot(HashCommon.java:164) > at org.apache.jena.mem.HashedBunchMap.put(HashedBunchMap.java:66) > at org.apache.jena.mem.NodeToTriplesMapMem.add(NodeToTriplesMapMem.java:51) > at > org.apache.jena.mem.GraphTripleStoreBase.add(GraphTripleStoreBase.java:60) > at org.apache.jena.mem.GraphMem.performAdd(GraphMem.java:37) > at org.apache.jena.graph.impl.GraphBase.add(GraphBase.java:181) > at org.apache.jena.rdf.model.impl.ModelCom.add(ModelCom.java:1191) > at > org.apache.jena.rdf.model.impl.ResourceImpl.addLiteral(ResourceImpl.java:285) > at OhDearTest.lambda$0(OhDearTest.java:15) > at java.lang.Thread.run(Thread.java:745) > java.lang.ArrayIndexOutOfBoundsException: 918 > at org.apache.jena.mem.HashCommon.findSlot(HashCommon.java:164) > at org.apache.jena.mem.HashedBunchMap.get(HashedBunchMap.java:59) > at org.apache.jena.mem.NodeToTriplesMapMem.add(NodeToTriplesMapMem.java:50) > at > org.apache.jena.mem.GraphTripleStoreBase.add(GraphTripleStoreBase.java:60) > at org.apache.jena.mem.GraphMem.performAdd(GraphMem.java:37) > at org.apache.jena.graph.impl.GraphBase.add(GraphBase.java:181) > at org.apache.jena.rdf.model.impl.ModelCom.add(ModelCom.java:1191) > at > org.apache.jena.rdf.model.impl.ResourceImpl.addLiteral(ResourceImpl.java:285) > at OhDearTest.lambda$0(OhDearTest.java:15) > at java.lang.Thread.run(Thread.java:745) > java.lang.ArrayIndexOutOfBoundsException: 1109 > at org.apache.jena.mem.HashCommon.findSlot(HashCommon.java:164) > at org.apache.jena.mem.HashedBunchMap.get(HashedBunchMap.java:59) > at org.apache.jena.mem.NodeToTriplesMapMem.add(NodeToTriplesMapMem.java:50) > at > org.apache.jena.mem.GraphTripleStoreBase.add(GraphTripleStoreBase.java:60) > at org.apache.jena.mem.GraphMem.performAdd(GraphMem.java:37) > at org.apache.jena.graph.impl.GraphBase.add(GraphBase.java:181) > at org.apache.jena.rdf.model.impl.ModelCom.add(ModelCom.java:1191) > at > org.apache.jena.rdf.model.impl.ResourceImpl.addLiteral(ResourceImpl.java:285) > at OhDearTest.lambda$0(OhDearTest.java:15) > at java.lang.Thread.run(Thread.java:745) > java.lang.ArrayIndexOutOfBoundsException: 1144 > at org.apache.jena.mem.HashedBunchMap.put$(HashedBunchMap.java:87) > at org.apache.jena.mem.HashedBunchMap.put(HashedBunchMap.java:70) > at org.apache.jena.mem.NodeToTriplesMapMem.add(NodeToTriplesMapMem.java:51) > at > org.apache.jena.mem.GraphTripleStoreBase.add(GraphTripleStoreBase.java:60) > at org.apache.jena.mem.GraphMem.performAdd(GraphMem.java:37) > at org.apache.jena.graph.impl.GraphBase.add(GraphBase.java:181) > at org.apache.jena.rdf.model.impl.ModelCom.add(ModelCom.java:1191) > at > org.apache.jena.rdf.model.impl.ResourceImpl.addLiteral(ResourceImpl.java:285) > at OhDearTest.lambda$0(OhDearTest.java:15) > at java.lang.Thread.run(Thread.java:745) > > ## The Oh Dear Exception > > The code above doesn't seem to produce this, but it's what I initially ran > into. > > Caused by: org.apache.jena.shared.BrokenException: oh dear, already > have a slot for 24e48338:15b5d4bfe76:-7ff3, viz 13 > at org.apache.jena.mem.HashedBunchMap.grow(HashedBunchMap.java:109) > at org.apache.jena.mem.HashedBunchMap.put$(HashedBunchMap.java:90) > at org.apache.jena.mem.HashedBunchMap.put(HashedBunchMap.java:70) > at > org.apache.jena.mem.NodeToTriplesMapMem.add(NodeToTriplesMapMem.java:51) > at > org.apache.jena.mem.GraphTripleStoreBase.add(GraphTripleStoreBase.java:60) > at org.apache.jena.mem.GraphMem.performAdd(GraphMem.java:37) > at org.apache.jena.graph.impl.GraphBase.add(GraphBase.java:181) > at org.apache.jena.rdf.model.impl.ModelCom.add(ModelCom.java:1191) > at org.apache.jena.rdf.model.impl.ModelCom.add(ModelCom.java:184) > at org.apache.jena.rdf.model.impl.ModelCom.add(ModelCom.java:172) > at > org.apache.jena.rdf.model.impl.ResourceImpl.addProperty(ResourceImpl.java:263) > > > -- > Joshua Taylor, http://www.cs.rpi.edu/~tayloj/