Wie reagiert die JVM eigentlich auf Multi-Cores?

Wie der Titel schon sagt habe ich mir die Frage gestellt, ob die ganzen Kerne in aktuellen CPUs eigentlich zu einer Leistungsverbesserung von Java Progammen führen. Natürlich müssen die Probleme dafür parallelisierbar sein usw., aber mich interessiert eigentlich mehr, ob z.B. Threads in Java auf alle verfügbaren Prozessoren verteilt oder nur auf einem gerechnet werden. Dabei bin ich auf einen wirklich sehr guten Artikel von Ilya Grigorik gestoßen, in dem er genau dieses Szenario anhand von Ruby, Python und Java ausführt. Kann ich jedem Leser nur empfehlen selbst zu lesen.

Es stellt sich herraus, dass die Java Threads von der JVM auf OS-Threads abbildet und somit eine Verteilung auf die Verfügbaren Kerne realisiert wird. Die Skriptsprachen Pyhton und Ruby hingegen verwenden zur Synchronisierung einen Golobl Interpreter Lock (GIL), um die Nutzung von gemeinsam verwendetem, nicht Thread-sichern Code zu verhindern. Dieser GIL ist der Flaschenhals, auch wenn Ruby Threads mittlerweile 1-zu-1 auf OS-Threads abgebildet werden. Verwendet man JRuby oder Jython dieses Problem übrigens gelöst, da der GIL in diesen Implementierungen nicht benötigt wird.