repaint() is save unless you call it from repaint(). So there is no problem calling it from the VSync tick.
In this case update() is fine.