Conocimientos como una presentación personal de 1 minuto para una entrevista
«¿Cuál es la diferencia entre un proceso y un hilo?»
Cuando buscaba empleo, esta pregunta siempre estaba incluida en las «10 preguntas más comunes en las entrevistas». Respondí como una máquina.
«Un proceso es un programa en ejecución y un subproceso es una unidad de flujo que se ejecuta dentro de un proceso. Los procesos no comparten recursos, pero los subprocesos comparten recursos.»
El entrevistador asintió y supuse que entendía perfectamente este concepto. Sin embargo, hasta que encontré el ‘Problema de Concurrencia’ en la práctica, no tenía idea del verdadero miedo contenido en esa frase.
«¿Por qué se supone que el número de vistas aumenta en 100, pero solo aumenta en 98?» «¿Por qué el sitio web se detiene cuando descargo Excel?»
Mi código era perfecto cuando lo ejecutaba solo, pero se convertía en un desastre cuando varios usuarios entraban al mismo tiempo. Pensé que se solucionaría simplemente aumentando el número de ‘trabajadores’, pero no sabía que a medida que aumenta el número de trabajadores, el coste de gestionarlos (cambio de contexto) aumenta exponencialmente.

Fábrica y trabajadores en centro de logística digital
Volvamos a nuestra visión del mundo de “centro logístico digital”. Ejecutar un programa en una computadora es como instalar una «fábrica» en un centro de distribución.
1. Proceso: lugar de trabajo independiente
2. Hilo: Trabajadores en el taller

[Verificación de código] Tragedia de compartir (problema de concurrencia)
«Los hilos comparten recursos». Esto puede parecer una ventaja en la sala de entrevistas, pero en la práctica puede ser la semilla del «desastre».
¿Recuerdas el «Montón» que aprendimos la última vez? Los hilos comparten esta área del montón. Esto significa que el subproceso B puede venir y sobrescribir los datos en los que está trabajando el subproceso A.
Esto se llama «Condición de carrera». Comprobémoslo con código.
public class RaceConditionTest {
static int count = 0; // Variable compartida almacenada en el Heap
public static void main(String[] args) throws InterruptedException {
// Contratar dos trabajadores (hilos)
Thread t1 = new Thread(() -> {
for (int i = 0; i < 10000; i++) count++;
});
Thread t2 = new Thread(() -> {
for (int i = 0; i < 10000; i++) count++;
});
t1.start(); // iA trabajar!
t2.start(); // iA trabajar!
t1.join(); // Esperar hasta que termine su jornada
t2.join(); // Esperar hasta que termine su jornada
System.out.println("Resultado final: " + count);
}
}
Resultado esperado: Dado que dos personas sumaron 10.000 veces, el resultado debería ser 20.000.
Resultado real: 15,482, 18,931… El valor es diferente cada vez que lo ejecuto y 20,000 no se muestra.
Razón:
Esta es la identidad del error que “a veces se mastican datos” en la práctica. Esta es una tragedia que ocurrió cuando los trabajadores tocaron el mismo libro de contabilidad sin hablar entre ellos.
Si comparamos esta situación con una base de datos (DB), es lo mismo que ‘una situación en la que se realizan múltiples consultas simultáneamente sin una transacción’. Si al mismo tiempo se modifica el saldo de la cuenta bancaria sin bloqueo, se produce un terrible accidente en el que el dinero se evapora. Así como protegemos los datos con ROLLBACK o COMMIT en la base de datos, un dispositivo de bloqueo como Synchronized es absolutamente necesario a nivel de código.
Compensación en la práctica: multiproceso versus multiproceso
Entonces, ¿cuándo y qué deberías utilizar en la práctica?
1. Navegador Chrome preferido: multiproceso
En el antiguo Internet Explorer, cuando se detenía una pestaña, se cerraba todo el navegador (método multiproceso). Sin embargo, Chrome inicia cada pestaña como un «proceso independiente (fábrica)».
2. Elección de servidor web (Spring, Node.js, etc.): Multiproceso
El servidor debe manejar miles de solicitudes. Si crea un proceso (fábrica) para cada solicitud, el servidor fallará. Por lo tanto, se procesa teniendo numerosos subprocesos (trabajadores) en un solo proceso.

Cierre: La autoinmolación conlleva responsabilidad
Hoy analizamos los «procesos e hilos», la forma en que trabajan los trabajadores.
Ahora ya sabes que el término «problemas de concurrencia» no es sólo un término de entrevista. Numerosos trabajadores de subprocesos entran y salen constantemente de un almacén compartido llamado Heap. Es la habilidad de un desarrollador back-end crear orden en este caos.
Pero espera, si hay muchos trabajadores, ¿cómo se decide quién debe hacer el trabajo de quién primero? ¿Cómo gestiona un director de fábrica (OS) a cientos de trabajadores? La próxima vez hablaremos de la tarea más problemática del director de la fábrica: «Programación y cambio de contexto».