java gil_为什么 Java 没有 GIL?

GIL 是个伪命题 ——初级程序员很容易被 80 年代的中文翻译过来的垃圾过时教程说,解决 concurrency 只能用多线程。然后就拿着多线程这个锤子到处找钉子。

其实这里要区分一个 IO 密集和 CPU 密集的,IO 密集,即便有 GIL 也可以通过 coroutine 或者 Fiber 很好解决,性能不低。

CPU 密集——这个得好好想一下。

如果只有一个核心,10 件事每个事要做 1 分钟,对于 CPU 密集任务,怎么用多线程都还是至少需要 10 分钟才能得到结果吧?多线程有毛用?

如果有多个核心,这就是 Python/Ruby 的问题了。只能用一个核心来处理任务。因为有 GIL。

所以 GIL 不是不能用多线程问题,而是多线程只能用单个核心的问题。但是实际上,大家也不是没见过 Chrome 啊,3D 游戏里只把一个核心占满的情况。这不就是只能利用一个核心的毛病么?为啥 GIL 就臭名昭著,而 C/C++ 大家就会很自然想到一个借口说你代码写得不好呢?

但是反过来说,你要用脚本语言解决计算密集问题?你 TM 逗我?计算性能问题,首先就得说 MRI/CPython 这个和 C 语言 30 倍性能差距的问题。。。。。。。。。。

就算没 GIL 的 Java 里,写多线程也不是个什么好体验。JVM 是不会卡进程,各种锁得你自己搞。搞得不好还是会卡进程。就算 C/C++ 直接用 pthreads,写起来是各种坑。

在实际应用中,GIL 给大家带来的不便是 0 。绝大多数市面上能看到的多线程教程,无论什么语言,都是用来解决 io wait 的问题的。 io wait 在 Ruby/Python 已经有 n 种解决方案了。

你如果写代码真碰到 GIL 问题了,请一定怀疑你的姿势不对。

自后还是要喷一下:为什么 nodejs 没有 GIL 问题?因为别人压根不支持多线程。(还不是活得好好的。)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值