1. a,b两个线程同时访问不同的同步方法
2. 新增一个普通方法,然后一个线程访问同步方法,一个线程访问普通方法
3. 两个线程分别用两个对象去调用资源类
4.两个线程访问两个不同的 静态 同步方法
5. 一个静态同步方法,一个普通同步方法,同一个资源对象去访问
6. 同步代码块
最终结论:
1. 所有的普通同步方法用的都是同一把锁——实例对象本身,就是new出来的具体实例对象本身,本类this,也就是说如果一个实例对象的普通同步方法获取锁后,该实例对象的其他普通同步方法必须等待获取锁的方法释放锁后才能获取锁(同步代码块一样)。
2. 所有的静态同步方法用的也是同一把锁——类对象本身,就是我们说过的唯一模板Class
3. 具体实例对象this和唯一模板Class,这两把锁是两个不同的对象,所以静态同步方法与普通同步方法之间是不会有竞态条件的 但是一旦一个静态同步方法获取锁后,其他的静态同步方法都必须等待该方法释放锁后才能获取锁。
4. 能锁区块,就不要锁整个方法体;能用对象锁,就不要用类锁。