你的头脑中需要保持清醒区分拥有你在类定义中声明成synchronised实例方法的对象和可以用它们执行的线程在了个线程和myClass类的两个对象间的假设关系在下图中说明
图中箭头上的数字表示事件的次序No!表示线程需要等到方法被解锁才能执行当obj中methodl()正执行时同一对象的method()不能被执行一个对象的这两个实例方法的同步提供了同一象的保护等级因为在任问给定时刻只有一个同步方法才能与对象中的数据相关
尽管如此当每个对象启动同步的实例方法时它独立于任何其他对象当一个线程对一个对象执行同步方法时确保在涉及到该对象同步方法范围内独占地访问尽管另一个线程对不同对象仍能调用相同的方法当对obj止执行method()方法时不妨碍其他线程对obj执行method ()方法而且如果一个对象中有方法没被声明成synchronized例如obj中的rnethod()任何线程可以在任何时刻调用无论对象中仟一同步方法是如何声明的
如果你在一个类中将同步应用成static方法这个类中在任一时刻只能有一个static方法被执行这是每一类的同步而且这个类的锁独立于任们这个类的对象的锁
你需要理解的一个重要原则是在代表线程的一个类对象中惟一有必要成为一个线程的一部分的方法是run()方法对同一类对象的其他为一法如果直接或间接被run()调用才作为线程的一部分对一个对象在run()中直接或间接被调用的所有方法都是同一线程的一部分但明显地它们不必是同一Thread对象的方法它们的确是属于任何其他对象的方法包括拥有自己run()方法的其他Thread对象
[] [] [] [] [] [] [] [] []