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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孔斌 中级黑马   /  2013-2-4 11:09  /  1572 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

当一个线程进入另一个对象的一个synchronized方法后,那么其它线程是否可进入此对象的其它方法呢?

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

4 个回复

倒序浏览
本帖最后由 散人online 于 2013-2-4 13:19 编辑

如果其它方法有加synchronized关键字,是不可以的,他们用的锁都是this.
如果其它方法有加synchronized关键字,并且这个其它方法是静态的,就可以
因为静态方法用的锁是类名.Class()字节码对象。锁不同。
如果没加没有锁当然可以。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
楼上无大误,我再详细说下:
一、主方法为非静态同步方法,则其他方法访问性为:
         状态                  是否静态         是否允许访问          主方法锁对象        其他方法锁方法
      synchronized           是               true                                 this                 className.class                          
      synchronized           否               false                                 this                        this
   非synchronized         是或否         true                                  this                        无


二、主方法为静态同步方法,则其他方法访问性为:
         状态                  是否静态         是否允许访问          主方法锁对象        其他方法锁方法
      synchronized           是               false                       className.class        className.class                          
      synchronized           否               true                       className.class                  this
   非synchronized         是或否         true                        className.class                  无

从以上可以看出,只要锁不同就可以进入。当锁相同时无法进入

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
只要不是同一个锁就可以  非静态同步函数的锁是当前对象也就是this  静态静态同步函数的锁是该类所对应字节码的对象 也就是类名.class    只要注意不是一个锁就可以了
回复 使用道具 举报
你说的此对象是哪个对象呢?
如果是那个线程所在的对象的话 那其他线程是可以的 因为这个线程拿住的是这个对象的锁
如果说这个对象是这个线程正在访问的对象的话 其他线程访问要看会不会也访问你这个加了同步的方法 如果是访问其他没加同步的方法是没有影响的 当然如果是也是访问这个加了同步的方法那就得等了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马