A JVM (pelo menos hotspot) tem um conceito semelhante ao "GIL", é muito mais fina em sua granularidade de bloqueios, a maior parte disso vem dos GCs em hotspot, que são mais avançados.
No CPython, é um grande bloqueio (provavelmente não tão verdadeiro, mas bom o suficiente para o argumento), na JVM é mais difundido com conceitos diferentes, dependendo de onde é usado.
Veja, por exemplo, vm / runtime / safepoint.hpp no código do ponto de acesso, o que é efetivamente uma barreira. Uma vez em um ponto seguro, a VM inteira parou em relação ao código java, assim como a VM python para no GIL.
No mundo Java, esses eventos de pausa da VM são conhecidos como "pare o mundo"; nesses pontos, apenas o código nativo que está vinculado a determinados critérios é de execução livre; o restante da VM foi interrompido.
Além disso, a falta de um bloqueio grosseiro no java torna a JNI muito mais difícil de escrever, pois a JVM oferece menos garantias sobre seu ambiente para chamadas de FFI, uma das coisas que o cpython facilita bastante (embora não seja tão fácil quanto usar ctypes).