Ruby 为什么 Java 没有 GIL?

linjunhalida · 2015年03月19日 · 最后由 est 回复于 2015年03月20日 · 8591 次阅读

python 和 ruby 都有 GIL,但是好像一些其他语言没有 GIL,请问其他语言(比如 java)如何处理这个问题的?是所有库都有 lock 保证资源安全吗?

不是 python, ruby 有 GIL,而是 python 的最流行的解释器 cpython 和 ruby 的最流行的解释器 mri 都实施了 GIL .

解释器中实施 GIL 与否是个设计决定,选任何一个都要做出些妥协,具体可以搜搜看。

JVM 没有 GIL,但是也有锁,只是锁的粒度细小得多,一般不会整个线程给你锁上。

楼主是想问 java 中 synchronized 这东西的么?

jvm 的锁优化做的远胜 ruby,python,种类多,偏向缩,可重入锁,7 里面的并发库加入以 cas(compare and swap)实现的解决锁开销问题也是一大亮点,也是为了适应多核环境,ruby python 主流解释器无法完全开发多核性能。相应的,设计复杂度上就高出几个数量级。

主要是 Java 有金主,有人撑腰 👻

java 是对象锁,而且 java 很少在运行期进行对象的修改,但 ruby 这种动态语言可以在运行期进行类的修改。

以我阅读《Seven Concurrency Models in Seven Weeks》第一章了解到的,Java 线程需要程序员处理的问题一样有,然后作者再三强调用锁很容易出错,推荐用其它并发/平行模型。

JRuby 实现据说可以没有 GIL

需要 登录 后方可回复, 如果你还没有账号请 注册新账号