Si está bloqueando y desbloqueando con mucha frecuencia, puede haber una penalización, ya que la obtención y liberación de bloqueos lleva algo de tiempo, y puede llevar bastante tiempo si se disputan los bloqueos.
Cuando utilice muchos bloqueos en una estructura como esta, tendrá que ser muy específico sobre lo que bloquea cada bloqueo, y asegúrese de tener cuidado con los bloqueos AB-BA. Por ejemplo, si está cambiando la estructura del árbol durante una operación de bloqueo, deberá bloquear todos los nodos que se cambiarán, en un orden consistente, y asegurarse de que los hilos que trabajan en los descendientes no se confundan.
Si tiene un número muy grande de bloqueos distribuidos en la memoria, los problemas de almacenamiento en caché podrían causar problemas de rendimiento, según la arquitectura, ya que las operaciones de bloqueo generalmente invalidarán al menos parte de la caché.
Su mejor opción es probablemente implementar una estructura de bloqueo simple, luego perfilarla, y luego refinarla para mejorar el rendimiento, si es necesario. No estoy seguro de lo que está haciendo con el árbol, pero un buen lugar para comenzar podría ser un único bloqueo lector-escritor para todo el árbol, si espera leer mucho más de lo que actualiza.
"Deberíamos olvidarnos de pequeñas eficiencias, digamos aproximadamente el 97% del tiempo: la optimización prematura es la raíz de todo mal". - Donald Knuth
Algunos miles en un solo árbol son ... algo cuestionables ... pero difíciles de decir sin verlo realmente. ¿Puedes publicar suficiente código para mostrar un ejemplo razonablemente completo de lo que estás haciendo? –