是Clojure Refs/do-sync只相当于java"synchronized"块?

ted*_*ddy 1 concurrency transactions clojure stm

我试图说服自己,对于并发编程来说,clojure确实比java更容易.

但我觉得Clojure Refs/do-sync与java"synchronized"块几乎完全相同.然后我读了这个帖子:Clojure STM(dosync)x Java同步块

---我正在重新启动一个新线程,因为如果我在旧线程中评论,由于年龄的原因,响应可能不高.

MichałMarczyk在该主题中的第一条评论声称差异是java同步块在Clojure使用事务时使用锁.我认为这个说法没有涉及问题的本质:在底部,交易仍然由锁实现.所以"java using locks"并不是Clojure更好的原因.

我认为真正的好处是Clojure事务会自动管理锁,就像数据库事务一样.这样,获取锁的顺序和发挥事务的顺序由事务管理器决定,因此程序员不需要关心它,而在java世界中,程序员必须明确选择要使用的锁.同步块,导致可能的死锁.例如,事务管理器可以使用两阶段锁定来避免死锁.

以上是否有意义?

谢谢杨

Grz*_*ywo 6

Clojure中的Ref是一种不同的并发抽象,它的工作方式类似于数据库事务 - 它具有Atomicity,Consistency和Isolation属性.它建立在JVM锁定机制之上,因此可以在Java中自己实现它.我们不这样做的原因是Ref like机制需要事先实现其他非平凡机制:


Mic*_*zyk 5

这里引用答案的作者 - 让我试着详细说明:

实际上,在引用的答案中,我首先声称" dosync并且synchronized允许访问完全不同的并发抽象".此外,我不仅描述synchronized为"使用锁",而且描述为"获取和释放锁定的方式".

换句话说,虽然STM当然使用引擎盖下的锁,但它暴露了事务性语义,这可以被理解; 例如,它通过构造没有死锁(但是,活锁是可能的).相比之下,synchronized显然没有或多于程序员声明要在大括号标记的点处获取和释放此类对象的监视器的方式.这里的重要区别是语义,而不是实现.

此外,STM比管理锁定订单更多; 有MVCC,由格热戈日提到,有自动重启交易,有ensurecommute(控制与并发性权衡的一致性,如果你愿意),还有的STM和代理之间(代理操作放入队列与合作,send只有在提交获得出动从交易中调用的时间).

因此,STM确实是一种管理锁的机制,因此将其描述为有用; 但更大的图像是该STM实现使用它需要的任何内部细节,锁具包括在内,以提供具有替代并发抽象编程,合理非漏泄,这最终必须接近这样如果一个是提取从全益处它.