Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Neo4j中创建唯一的序列号?_Java_Neo4j_Thread Safety - Fatal编程技术网

Java 如何在Neo4j中创建唯一的序列号?

Java 如何在Neo4j中创建唯一的序列号?,java,neo4j,thread-safety,Java,Neo4j,Thread Safety,我正在编写一个非托管扩展 因为Neo4J没有任何内置的功能来获取序列号,所以我编写了这个方法来实现类似的功能。使用“synchronized”关键字可以很好地工作,但是如果没有它,我在测试用例中尝试使用它时会遇到死锁检测异常,在测试用例中,我同时从多个线程调用它 这是解决这个问题的好办法吗 为什么我需要使方法“同步”,难道“收单机构锁定”还不够吗 public synchronized static int getNextSequence(节点,字符串属性){ int序列=0; GraphDat

我正在编写一个非托管扩展

因为Neo4J没有任何内置的功能来获取序列号,所以我编写了这个方法来实现类似的功能。使用“synchronized”关键字可以很好地工作,但是如果没有它,我在测试用例中尝试使用它时会遇到死锁检测异常,在测试用例中,我同时从多个线程调用它

这是解决这个问题的好办法吗

为什么我需要使方法“同步”,难道“收单机构锁定”还不够吗

public synchronized static int getNextSequence(节点,字符串属性){
int序列=0;
GraphDatabaseService graphDb=node.getGraphDatabase();
try(事务t=graphDb.beginTx()){
t、 锁(节点);
sequence=(int)node.getProperty(property);
node.setProperty(属性,序列+1);
//锁在t.success()时自动释放。
t、 成功();
}捕获(例外e){
错误(“无法获取节点({})、属性({})、异常({})”的序列,节点,属性,e);
投掷e;
}
返回序列;
}
编辑
在@cybersam作出响应后,我将acquireReadLock更改为acquireWriteLock,这解决了死锁问题,我不再需要同步方法

更新后的代码如下所示:

public static int getNextSequence(节点,字符串属性){
int序列=0;
GraphDatabaseService graphDb=node.getGraphDatabase();
try(事务t=graphDb.beginTx()){
t、 acquireWriteLock(节点);
sequence=(int)node.getProperty(property);
node.setProperty(属性,序列+1);
//锁在t.success()时自动释放。
t、 成功();
}捕获(例外e){
错误(“无法获取节点({})、属性({})、异常({})”的序列,节点,属性,e);
投掷e;
}
返回序列;
}

您的代码实际上正在向节点写入(以及从节点读取),但您只获得了一个读取锁。你必须改用。一旦这样做,就应该去掉“synchronized”(请参见中的警告)