Leí un artículo que dice que Scala maneja la concurrencia mejor que Java.
http://www.theserverside.com/feature/Solving-the-Scalability-Paradox-with-Scala-Clojure-and-Groovy
... la limitación de escalabilidad se limita específicamente al lenguaje de programación Java en sí, pero no es una limitación de la plataforma Java en su conjunto ...
Los problemas de escalabilidad con Java no son una nueva revelación. De hecho, se ha trabajado mucho para abordar estos mismos problemas, con dos de los proyectos más exitosos que son los lenguajes de programación llamados Scala y Clojure ...
... Scala está encontrando formas de evitar el hilo problemático y el paradigma de bloqueo del lenguaje Java ...
¿Cómo es esto posible? ¿Scala no usa las bibliotecas principales de Java que traen todos los problemas de enhebrado y bloqueo de Java a Scala?
fuente
Es una cuestión de soporte de la biblioteca. Java utiliza la construcción de subprocesos de bajo nivel para representar la concurrencia (esto es como el lenguaje ensamblador del mundo de concurrencia). Hay muchas bibliotecas y técnicas que puede usar para crear soluciones escalables además de estas, como usar el soporte proporcionado por el paquete java.util.concurrent y seguir las técnicas de Brian Goetz en su libro Java Concurrency in Practice. Scala ayudó a introducir cosas como el marco de Akka (también utilizable por Java ahora) que incluye algunas de estas mejores prácticas y soporte de biblioteca. Eso no quiere decir que Java el lenguaje no pueda ponerse al día (colecciones paralelas, etc.), como dice Kilian, todo se ejecuta en la JVM y, por lo tanto, en la JMM.
Además, los objetos de Java también son mutables de forma predeterminada y requiere un conocimiento no trivial para hacerlos efectivamente inmutables. Scala supuestamente hace que sea más fácil crear objetos inmutables
fuente
Bueno, sí, y si bloqueas Scala te enfrentarás a los mismos problemas. Sin embargo, el punto es que no debes hacerlo, ya que Scala te proporciona abstracciones que manejan este problema de una manera más segura.
Ahora, Scala hace dos cosas que realmente ayudan. Uno de ellos es el modelo de actor, que puede considerarse como un patrón de concurrencia, proporcionado por Scala como una biblioteca. Si eres un programador de Java, te sugiero que vayas al sitio de Akka y veas sus cosas de Java. Esta es la biblioteca que reemplazará la biblioteca de actores actual de Scala, y puede usarla desde Java.
La segunda cosa que Scala hace que ayuda es usar estructuras de datos inmutables. No hay nada que evite que Java use estructuras de datos inmutables
String
, por ejemplo, ¡es inmutable en sí mismo! Las estructuras de datos inmutables no sufren problemas de concurrencia ya que los hilos no pueden cambiarlos.Hay otras cosas que se suman a estas, para crear soluciones completas, como agentes y stm (ambos disponibles de Akka), o pestillos (de Java).
Ahora, las dos cosas anteriores se pueden hacer en Java, como dije yo mismo. Puede usar Akka en Java, y puede escribir estructuras de datos inmutables en Java (o usar desde bibliotecas que las proporcionan). Sin embargo, Java dificulta el uso de estas cosas, ya que no admite tipos de orden superior, ni cierres y funciones de primera clase.
Entonces, aunque puede hacerlo, los programadores generalmente no lo harán porque, en Java, escribir dicho código es muy detallado (es decir, mucho más que el estándar para Java).
fuente
El pensamiento principal del artículo referenciado es:
No puedo estar de acuerdo con esto. Usar lenguajes JVM como Scala implica:
utilizando soporte de tiempo de ejecución específico. Se puede acceder a este soporte directamente desde los programas Java.
sintaxis específica, que permite expresiones concisas para hacer que el acceso al soporte de tiempo de ejecución sea fácil y menos propenso a errores. Esto es cierto, y escribir en Java puro es más detallado y requiere más disciplina, pero la brecha no es tan dramática.
En resumen, Scala maneja la concurrencia mejor que Java debido al uso del modelo Actor. El modelo de actor bien puede emplearse en Java. Existen varias bibliotecas de actores para Java, incluida Akka (utilizada por Scala), por lo que no es imprescindible cambiar a Scala.
El uso del modelo de actor a través de Java puro tiene sus propias ventajas:
fuente