黑马程序员技术交流社区

标题: 关于线程同步的问题? [打印本页]

作者: 孔斌    时间: 2013-2-4 11:09
标题: 关于线程同步的问题?
当一个线程进入另一个对象的一个synchronized方法后,那么其它线程是否可进入此对象的其它方法呢?
作者: 散人online    时间: 2013-2-4 11:57
本帖最后由 散人online 于 2013-2-4 13:19 编辑

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


作者: 宋朋山    时间: 2013-2-5 08:39
楼上无大误,我再详细说下:
一、主方法为非静态同步方法,则其他方法访问性为:
         状态                  是否静态         是否允许访问          主方法锁对象        其他方法锁方法
      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                  无

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


作者: 刘凯    时间: 2013-2-5 09:20
只要不是同一个锁就可以  非静态同步函数的锁是当前对象也就是this  静态静态同步函数的锁是该类所对应字节码的对象 也就是类名.class    只要注意不是一个锁就可以了
作者: walkonby    时间: 2013-2-5 09:49
你说的此对象是哪个对象呢?
如果是那个线程所在的对象的话 那其他线程是可以的 因为这个线程拿住的是这个对象的锁
如果说这个对象是这个线程正在访问的对象的话 其他线程访问要看会不会也访问你这个加了同步的方法 如果是访问其他没加同步的方法是没有影响的 当然如果是也是访问这个加了同步的方法那就得等了




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