首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure Refs/do-sync仅仅相当于java“同步”块吗?

Clojure Refs/do-sync仅仅相当于java“同步”块吗?
EN

Stack Overflow用户
提问于 2013-04-17 19:22:41
回答 1查看 1.2K关注 0票数 1

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

但是我觉得Clojure Refs/do-sync与java“同步”块几乎完全相同。然后我读了这个帖子:Clojure STM ( dosync ) x Java synchronize block

--我正在重新启动一个新的线程,因为如果我在旧的帖子中评论的话,由于年老,响应可能不会很高。

MichałMarczyk在该线程中的第一个注释声称,diff是java同步块使用锁,而Clojure使用事务。我认为这个声明并没有触及问题的本质:在底层,事务仍然是通过锁实现的。因此,"java使用锁“并不是Clojure更好的原因。

我认为真正的好处是Clojure事务自动管理锁,就像DB事务一样。这样,获取锁的顺序和播放事务的顺序由事务管理器决定,因此程序员不需要关心这一点,而在java世界中,程序员必须显式地选择用于同步块的锁,这会导致可能的死锁。例如,事务管理器可以使用两阶段锁定来避免死锁。

以上这些有意义吗?

谢谢杨

EN

回答 1

Stack Overflow用户

发布于 2013-04-17 20:19:27

Clojure中的Ref是一种不同的并发抽象,它的工作方式类似于数据库事务--它具有原子性、一致性和隔离性。它构建在JVM锁定机制之上,因此可以自己在Java中实现它。我们之所以不这样做,是因为Ref类机制需要预先实现其他重要的机制:

  • Persistent Data Structures
  • MVCC STM
  • 不可变数据,事务内部没有副作用(因为它们是自动重试的)
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16068448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档