I never implemented the JVM myself or even participated in its development, but I can imagine a compromise.
The first idea that comes to mind to associate an internal lock with each object is to do this: to associate a lock with its state (I am blocked, by what thread) for each object created in the JVM, it is placed along with the rest of the state of the object . It must be effective. However, it also forces each created object to occupy additional memory space, and this space will in most cases never be used (since synchronization is not shared, and most objects are never used as a lock).
, - , , . , , , .. .
, , ( ), . , , , , , .