Java Titan ConcurrentModificationException
我正在用Titan-1.0.0测试批量装载 我在配置文件中设置了存储。批量加载=true 我在java程序中使用TitanBlueprintTransaction来提高图形加载性能,它是多线程的 我在加载过程中遇到ConcurrentModificationException异常,我的代码如下Java Titan ConcurrentModificationException,java,multithreading,titan,Java,Multithreading,Titan,我正在用Titan-1.0.0测试批量装载 我在配置文件中设置了存储。批量加载=true 我在java程序中使用TitanBlueprintTransaction来提高图形加载性能,它是多线程的 我在加载过程中遇到ConcurrentModificationException异常,我的代码如下 Iterator<TitanVertex> it = tx.query().has("key", key).vertices().iterator(); TitanVertex vtx = i
Iterator<TitanVertex> it = tx.query().has("key", key).vertices().iterator();
TitanVertex vtx = it.next();
在线程#1中,使用titan复合索引搜索顶点,如下所示
Iterator<TitanVertex> it = tx.query().has("key", key).vertices().iterator();
TitanVertex vtx = it.next();
当一个线程打开迭代器,而另一个线程修改同一个顶点时,可能会发生异常。如何解决此异常 在以前的版本中,
存储。批量加载
仅用于单线程操作。
听起来在Titan 1.0中可能仍然是这样。我对Titan不太熟悉,但如果我面临多线程问题,我会尝试分析其中的原因 并发访问发生了,我可以同步并发访问的最小区域是什么, 或者有什么更好的替代方案可用(例如:线程安全收集替代方案,其他访问方式) 此代码模拟此错误:
public class ConcurrentMod
{
public static <C extends Collection<String>> void fillCollectionTestData(C coll)
{
for(int i=0;i<10000;++i)
coll.add(String.valueOf(i));
}
public static void main(String[] args)
{
final List<String> data = new ArrayList<>();
fillCollectionTestData(data);
new Thread()
{
public void run()
{
//heavy opertaion for an array
for(int i=0;i<100;++i)
data.remove(i);
}
}.start();
for(String s:data)
s.length();
}
}
公共类ConcurrentMod
{
公共静态void fillCollectionTestData(C coll)
{
对于(int i=0;i)什么是tx.query().has(“key”,key).vertex()
和tx.getVertex(v)
?Iterable和TitanVertex可以发布更多的代码,比如事务是在哪里创建和完成的?堆栈跟踪也可以吗?实际上,将批加载选项设置为false不会有任何区别。
for(int i=0;i<100;++i)
//other threads can access array between 2 heavy array shifting
synchronized(data)
{
data.remove(i);
}
//and synchronize during array copy
String[] tmp = null;
synchronized(data)
{
tmp = data.toArray(Mirror.emptyStringArray);
}
for(String s:tmp)
s.length();