Java Titan 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

我正在用Titan-1.0.0测试批量装载

我在配置文件中设置了存储。批量加载=true

我在java程序中使用TitanBlueprintTransaction来提高图形加载性能,它是多线程的

我在加载过程中遇到ConcurrentModificationException异常,我的代码如下

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();