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