同步是为了保护对象的状态和内存,而不是代码。
同步是线程间的协助机制。一个缺陷就可能破坏这种协助模型,导致严重的后果。
获取监视器只能避免其他线程再次获取这个监视器,而不能保护对象。即便对象的监视器锁定了,不同步的方法也能看到(和修改)不一致的状态。
锁定 Object[] 不会锁定其中的单个对象。
基本类型的值不可变,因此不能(也无需)锁定。
接口中声明的方法不能使用 synchronized 修饰。
内部类只是语法糖,因此内部类的锁对外层类无效(反过来亦然)。
Java 的锁可重入(reentrant)。这意味着,如果一个线程拥有一个监视器,这个线程遇到具有同一个监视器的同步代码块时,可以进入这个代码块。