为什么Java虚拟机中没有GIL?为什么Python如此需要一个呢?

2024-05-19 14:43:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望有人能提供一些关于Java虚拟机的本质区别的见解,它允许Java虚拟机在不需要全局解释器锁(GIL)的情况下很好地实现线程,而Python则需要这样一种邪恶


Tags: 情况java全局线程解释器gil本质区别
3条回答

下面这篇博文http://www.grouplens.org/node/244中有一条评论,暗示了为什么IronPython或Jython很容易不用GIL,这是因为CPython使用引用计数,而其他两个VM都有垃圾收集器

我不明白为什么会这样,但这听起来似乎是一个合理的原因

JVM(至少hotspot)的概念与“GIL”类似,只是它的锁粒度更细,其中大部分来自更高级的GC in hotspot

在CPython中,它是一个大锁(可能不是那么正确,但为了参数的缘故,它已经足够好了),在JVM中,它更多地使用不同的概念,这取决于它的使用位置

例如,看看热点代码中的vm/runtime/safepoint.hpp,它实际上是一个障碍。一旦到了安全点,整个虚拟机就停止了java代码,就像python虚拟机停止在GIL一样

在Java世界中,这种VM暂停事件被称为“停止世界”,在这一点上,只有绑定到特定条件的本机代码是自由运行的,VM的其余部分已经停止

java中缺少粗锁也使得JNI的编写更加困难,因为JVM对其FFI调用环境的保证较少,而cpython使这一点变得相当容易(尽管不如使用ctypes那么容易)

Python(语言)不需要GIL(这就是为什么它可以完美地在JVM[Jython]和.NET[IronPython]上实现,并且这些实现可以自由地使用多线程)。CPython(流行的实现)一直使用GIL来简化编码(特别是垃圾收集机制的编码)和集成非线程安全的C代码库(以前有很多这样的库;-)

在其他雄心勃勃的目标中,Unladen Swallow项目为Python提供了一个无GIL的虚拟机——引用该网站的话,“此外,我们打算删除GIL并修复Python中的多线程状态。我们相信,通过实现更复杂的GC系统,比如IBM的Recycler,这是可能的(培根等人,2001年)。”

相关问题 更多 >