Java静态同步方法和非静态同步方法
所有的非静态同步方法用的都是同一把锁——该实例对象本身。也就是说如果一个实例对象的非静态同步方法获取锁后,该实例对象的其他非静态同步方法必须等待获取锁的方法释放锁后才能获取锁进而执行方法内容。可是不同的实例对象的非静态同步方法因为跟该实例对象的非静态同步方法用的不是同一个锁,所以不用等到该实例对象已获取锁的非静态同步方法释放锁就可以获取他们自己的锁。
而所有的静态同步方法用的也是同一把锁——对应类对象本身。由于静态同步方法与非静态同步方法所用的锁不可能是同一把锁,所以静态同步方法与非静态同步方法之间是不会有竞争的。但是一旦一个静态同步方法获取锁后,其他的静态同步方法都必须等待该方法释放锁后才能获取锁,而不管是同一个实例对象的静态同步方法之间,还是不同的实例对象的静态同步方法之间,只要它们同一个类的实例对象(静态同步方法的锁与对应的类有关和对象实例无关)!