Aparte del hecho de que Erlang se desarrolló específicamente para ejecutarse en situaciones concurrentes / paralelizadas / distribuidas, las dos técnicas principales que emplea para hacer esto posible son:
Sin efectos secundarios:
Esto significa que cuando le da a una función una pieza de datos para ejecutar, no afectará, salvo en casos muy estrictos, cualquier otra cosa en el sistema / proceso en ejecución. Esto significa que si ejecuta una función 300 veces a la vez simultáneamente, ninguna de esas 300 ejecuciones de la función afectará a ninguna de las otras.
La técnica de implementación para garantizar que no haya efectos secundarios se llama "inmutabilidad", lo que significa, en términos generales, que no se puede mutar (cambiar). Esto significa que tan pronto como cree una variable, el valor de esa variable no podrá modificarse. Erlang implementa este comportamiento con "asignación única", de modo que después de asignar un valor a una variable, no puede asignarle un valor nuevamente.
X = 1.
X = 2. // This is not a valid operation
Esto garantiza que ningún código pueda cambiar accidentalmente el valor de X causando una condición de carrera, por lo tanto, es inherentemente seguro para subprocesos y el uso concurrente se vuelve trivial. Este es un comportamiento muy poco común entre los lenguajes de software y la mayor forma en que Erlang logra ser tan adecuado para la ejecución concurrente.
El modelo del actor:
Esta es una forma particular de modelado que ha demostrado que hace que la implementación y administración del procesamiento concurrente sea muy simple para los desarrolladores. Directamente de wikipedia (http://en.wikipedia.org/wiki/Actor_model):
El modelo de actor adopta la filosofía de que todo es actor. Esto es similar a la filosofía de todo es un objeto utilizado por algunos lenguajes de programación orientados a objetos, pero difiere en que el software orientado a objetos generalmente se ejecuta secuencialmente, mientras que el modelo de actor es inherentemente concurrente. Un actor es una entidad computacional que, en respuesta a un mensaje que recibe, puede concurrentemente: enviar un número finito de mensajes a otros actores; crear un número finito de nuevos actores; designe el comportamiento que se utilizará para el siguiente mensaje que reciba. No se supone una secuencia de las acciones anteriores y podrían llevarse a cabo en paralelo. El desacoplamiento del remitente de las comunicaciones enviadas fue un avance fundamental del modelo de actor que permite la comunicación asincrónica y las estructuras de control como patrones de mensajes que pasan.