我正在寻找一个好的Java Graph Library,它对于并发访问是线程安全的。 JGraphT,JUNG,JTS非常好,但是对于并发访问,我将不得不在外部同步它,这将变得很痛苦。 这是一个痛苦,因为如果线程A必须访问50个顶点,线程B为另一个50,顶点的交叉点是20个顶点。现在在编写代码时我需要知道这个20,以便我可以相应地进行同步。 Pl建议
答案 0 :(得分:3)
您是否考虑过Neo4J
以下是描述其产品的摘录。
Neo4j是一个高性能的NOSQL图形数据库,具有成熟且强大的数据库的所有功能。
答案 1 :(得分:2)
我担心你所寻找的是不可能的,因为线程安全是算法的属性,而不是数据结构的属性。这是一个例子:
假设您的图表库有一个主Graph
类,其中包含许多方法,所有这些方法都是synchronized
。例如,addVertex()
,removeVertex()
,addEdge()
,removeEdge()
等。我们还要说Vertex
类有一些有用的方法,例如getAdjacentEdges()
例如,还在包含Graph
实例上进行同步。
现在显然因为一切都是同步的,所以不可能破坏数据结构。例如,您永远不会遇到v.getAdjacentEdges()
为您提供实际上不在包含顶点v
的图表中的边缘的情况。由于内部同步,图形结构始终在内部保持一致。
但是,在图表上运行的算法仍然可以轻松破解。例如,假设您写道:
for (Edge e : v.getAdjacentEdges()) {
g.removeEdge(e);
}
对getAdjacentEdges()
的调用是原子的,就像在循环中每次调用removeEdge()
一样,但算法本身不是。在此循环运行时,另一个线程可能会在v
附近添加新边,或者删除边或其他任何内容。为了安全起见,您仍然需要一种方法来确保整个循环是原子的,并且图形本身无法提供。
我认为,我最好的建议是将JGraphT与Akka's STM实现(或类似)一起使用,这样您就可以编写算法而无需提前确定哪些对象需要锁定。如果您不熟悉STM及其性能特征,Wikipedia's article on the topic可以很好地解释。
答案 2 :(得分:1)
JGraphT现在提供了一个线程安全的concurrent AsSynchronizedGraph
图实现。此外,JGraphT具有许多利用多线程的算法实现。例如,参见DeltaSteppingShortestPath算法。
答案 3 :(得分:0)
如何让几个线程做他们能做的任何事情,然后将解决方案提交给一个收集结果的主控制器并提出最佳解决方案。
答案 4 :(得分:0)
最简单的解决方案是创建一个大显示器。
public Object theBigGraphMonitor = new Object();
在对图表执行任何操作之前,请在该单个监视器上进行同步。
摆弄个别的眩晕似乎很难做对......至少可以说。
答案 5 :(得分:0)
如果您只想在本地更改节点,则可以为每个节点维护单独的锁定。最简单的方法是使用同步方法实现自定义节点类(也可以使用ReentrantLock),如下所示:
public class SynchronizedNode extends Node {
public synchronized void localOp1() { ... }
public synchronized void localOp2() { ... }
}
或
public class SynchronizedNode extends Node {
ReentrantLock lock ....;
public synchronized void localOp1() { lock.lock() try { ... } finally { lock.unlock } }
public synchronized void localOp2() { lock.lock() try { ... } finally { lock.unlock } }
}
答案 6 :(得分:0)
查看charts4j API。我们在我们的应用程序中使用它,合理的没有并发用户,并且还没有问题。我不确定API是否是线程安全的。
我们注意到的一个问题是,生成的图表的网址将指向 http://www.google.com / ... 如果您在内部工作,这可能是个问题VPN和互联网不可用。(可能有一种方法)。