Synchronize en valor, no objeto [duplicado]

Esta pregunta ya tiene una respuesta aquí:

Synchronizing en objetos String en Java 17 respuestas

Quiero hacer algo así en Java

  public void giveMoney(String userId, int money) {
    synchronized (userId) {

        Profile p = fetchProfileFromDB(userId);
        p.setMoney(p.getMoney() + userId);
        saveProfileToDB(p);

    }
   }

Pero, por supuesto, la sincronización en una cadena no es correcta. ¿Cuál es la forma correcta de hacer algo como esto?

Respuestas a la pregunta(7)

Su respuesta a la pregunta