Some quick tips out of my head
- don’t use multiple threads (like Swing does, for example, by mandating that everything is done in the EDT)
- don’t hold several locks at once. If you do, always acquire the locks in the same order
- don’t execute foreign code while holding a lock
- use interruptible locks