A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 林晓波 黑马帝   /  2012-1-7 19:42  /  2220 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 林晓波 于 2012-1-10 22:32 编辑

当访问synchronized方法时,表示将该对象上锁,还是该方法上锁

2 个回复

倒序浏览
synchronized关键字的作用域有二种:
1.是某个对象实例内,synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法;
2.是某个类的范围,synchronized static aStaticMethod{}防止多个线程同时访问这个类中的synchronized static 方法。它可以对类的所有对象实例起作用。

评分

参与人数 2技术分 +1 黑马币 +2 收起 理由
林晓波 + 2 赞一个!
admin + 1

查看全部评分

回复 使用道具 举报
是对类的方法上锁还是对对象的方法上锁,取决于这个方法有没有被static修饰
如果被static修饰了,那么这个方法就是所有对象共享的一个方法(内存中只有这一个方法),当你建立这个类的两个对象A和B时,当线程1访问对象A的这个static 方法时持有了锁,那么线程2访问B对象这个方法(其实就是同一个方法)时就进不来了。
相反,如果没有被static修饰,那么这个锁就是分别锁住了所有你建立的对象的方法,线程1访问A对象的这个方法时持有了这个对象A的方法锁,线程2仍然可以访问对象B的它的这个方法持有属于对象方法锁。

评分

参与人数 2技术分 +1 黑马币 +2 收起 理由
林晓波 + 2
admin + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马