Concurrency 使用细粒度锁的代码示例(JCR Jackrabbit?)

Concurrency 使用细粒度锁的代码示例(JCR Jackrabbit?),concurrency,tree,jackrabbit,jcr,concurrent-programming,Concurrency,Tree,Jackrabbit,Jcr,Concurrent Programming,我正在做一项学术研究,试图开发一种编程工具,帮助实现细粒度锁定功能,用于维护树状数据结构的并发程序 例如,程序员可以编写一些函数来接收树根节点并修改树(通过遍历某些路由和添加/删除节点),该工具将帮助他找到代码中应该锁定节点的位置以及可以释放节点的位置,这样这些函数就可以在同一棵树上并发执行 我正在寻找一些实际的代码示例,其中使用了这种细粒度锁定,或者可以使用它来获得更好的性能,但是程序员太懒了,没有实现它(例如,他在函数调用期间锁定了整个树,而没有释放无用的节点) 我阅读了有关JCR和Jack

我正在做一项学术研究,试图开发一种编程工具,帮助实现细粒度锁定功能,用于维护树状数据结构的并发程序

例如,程序员可以编写一些函数来接收树根节点并修改树(通过遍历某些路由和添加/删除节点),该工具将帮助他找到代码中应该锁定节点的位置以及可以释放节点的位置,这样这些函数就可以在同一棵树上并发执行

我正在寻找一些实际的代码示例,其中使用了这种细粒度锁定,或者可以使用它来获得更好的性能,但是程序员太懒了,没有实现它(例如,他在函数调用期间锁定了整个树,而没有释放无用的节点)

我阅读了有关JCR和Jackrabbit的文章,它们使用一个树状数据库,并发现了一篇解释如何在JCR中锁定节点的文章(但没有示例):

我在数据库方面有一个非常小的背景,我不完全理解在Jackrabbit数据库和并发性方面什么是允许的,什么是不允许的。不允许从两个线程访问同一个节点,但是不同的存储库呢?如果两个不同的客户端尝试访问同一个节点(例如,一个客户端尝试删除它,另一个客户端尝试修改它-session.save()会失败吗?)

谢谢,
Oren

首先,不要混淆数据库/jackrabbit/锁定。Jackrabbit实现了自己的锁定,数据库也是如此

Jackrabbit允许您使用
LockManager.lock()
锁定节点。将
isDeep
参数设置为true意味着下面的所有节点也将被锁定。锁定的节点可以被另一个会话读取,但不能修改

从技术上讲,如果两个线程使用相同的会话,那么它们可以编辑相同的节点,但这是相当危险的,应该避免

如果一个节点可能被2个并发会话修改,那么您应该始终锁定该节点。哪个会话最后到达那里应该等待锁被释放。如果未锁定,则至少有一个会话将抛出异常

我不知道您从不同的存储库访问节点是什么意思。一个节点只能属于一个存储库。如果您的意思是有两个jackrabbit实例访问同一个数据库,那么也应该避免这种情况,或者您应该考虑使用集群

在实现锁定时,它将取决于您的设计和需求。如果只有一个会话,那么锁定就没有意义,反之亦然。是否锁定节点或子树将取决于数据所表示的内容。例如,如果一个节点表示一个文件夹,您可能只想锁定该节点,而不是整个子树。如果一个子树代表一个复杂的文档,那么您可能需要锁定该子树


至于锁定整棵树,我希望我不会遇到这样的人

您还可以在Adobe论坛上查询CQ5()。CQ5的JCR实现,称为CRX,是ApacheJackrabbit的商业版本?你对其他技术开放吗?Clojure社区对并发性考虑很多,这是它的驱动因素之一。请参阅——在许多情况下,这表明,在实践中,程序员在不显式使用锁的情况下可以编写更好的程序。这就是为什么Clojure提供了与传统Java锁定有很大不同的方法。如果你对此持开放态度,我们可以找到大量Clojure代码示例。锁定整个jackrabbit树的人被称为蠢驴。