Alguien más mencionó la disponibilidad de bloqueos justos. Si realmente te importa quién es el primero, entonces es posible que tengas un problema en tiempo real. En ese caso, puede hacer uso de RTSJ, donde se especifica el orden y la semántica de la adquisición de bloqueo. Los detalles están disponibles en RTSJ Spec bajo Sincronización. Citando de la sección razón de ser:
reglas de Java para código sincronizado proporcionan un medio para la exclusión mutua pero no impiden sin límites prioritarias inversiones y por lo tanto son insuficientes para aplicaciones en tiempo real. Esta especificación fortalece los semántica para código sincronizado por obligatoriedad de control de inversión de prioridades, en particular mediante el suministro de clases para la herencia de prioridad y la emulación techo prioridad . La prioridad es la más ampliamente implementada en sistemas operativos en tiempo real y por lo tanto es obligatorio y es el mecanismo predeterminado predeterminado en esta especificación .
Si 'bloqueos justos' es lo que está buscando, mire el paquete java.util.concurrent. Como ejemplo, ReEntrantLocks es justo. La equidad proviene del hecho de que se da prioridad a los hilos de espera más largos, análogos al concepto de 'Envejecimiento' en la programación de procesos. – questzen