Many people would regard plain synchronisation as old‑fashioned coding. Since Java5 (getting on for thirteen years ago), most people would probably use a
Lock instance.
That can lock multiple methods simultaneously in the order they are called. You do have to use a finally. You cannot use try with resources. The finally must come at the very end of the method.
Only allowing one instance of the class to have a method accessed from one thread at a time sounds a strange requirement. Please explain what that means and why you want to do it. My object‑oriented‑thinking brain cell is getting all confused about that. If you have two objects, why can you not call a method on each simultaneously? Why pass an Object from elsewhere? That doesn't seem to comply with the single responsibility principle. The object should take care of itself, without requiring outside code provide the lock for it. I still think the lock should be a field of the Foo class; if you really only want one lock, then make it static. Again, I am thinking is that really object‑oriented?
Please explain why you have this requirement, or (far better) is it simply a what if...sort of question?