黑马程序员技术交流社区

标题: 当访问synchronized方法时的问题 [打印本页]

作者: 林晓波    时间: 2012-1-7 19:42
标题: 当访问synchronized方法时的问题
本帖最后由 林晓波 于 2012-1-10 22:32 编辑

当访问synchronized方法时,表示将该对象上锁,还是该方法上锁
作者: 孙海亮    时间: 2012-1-7 20:48
synchronized关键字的作用域有二种:
1.是某个对象实例内,synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法;
2.是某个类的范围,synchronized static aStaticMethod{}防止多个线程同时访问这个类中的synchronized static 方法。它可以对类的所有对象实例起作用。
作者: 胡威    时间: 2012-1-7 22:48
是对类的方法上锁还是对对象的方法上锁,取决于这个方法有没有被static修饰
如果被static修饰了,那么这个方法就是所有对象共享的一个方法(内存中只有这一个方法),当你建立这个类的两个对象A和B时,当线程1访问对象A的这个static 方法时持有了锁,那么线程2访问B对象这个方法(其实就是同一个方法)时就进不来了。
相反,如果没有被static修饰,那么这个锁就是分别锁住了所有你建立的对象的方法,线程1访问A对象的这个方法时持有了这个对象A的方法锁,线程2仍然可以访问对象B的它的这个方法持有属于对象方法锁。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2