黑马程序员技术交流社区

标题: 学习中,遇到个问题,想问一下大家。 [打印本页]

作者: 余威宏    时间: 2013-5-5 22:43
标题: 学习中,遇到个问题,想问一下大家。
当一个线程进入一个对象的一个 synchronized 方法后,其它线程是否可进入此对象的其它方法?? 请朋友们详细解答一下,多谢谢了。。。
作者: 白磊    时间: 2013-5-5 23:15
当访问一个synchronized方法时,就等于对这个对象上了锁,钥匙就在这个线程手中,在未执行完这个方法以前,其他的线程不可能拿到锁的钥匙,也就无法访问这个方法。但是对于其他不是同步方法的方法,它没有上锁,其他的线程也就不需要钥匙就可以访问它了。
这个应该分三种情况的:
1,一个线程在访问一个对象的同步方法也就是synchronized方法时另一个线程可以同时访问这个对象的非同步方法。
2.一个线程在访问一个对象的同步方法时,另一个线程不能同时访问这个同步方法。
3,一个线程在访问一个对象的同步方法时,另一个线程不能同时访问这个对象的另一个同步方法
作者: 余威宏    时间: 2013-5-6 18:02
白磊 发表于 2013-5-5 23:15
当访问一个synchronized方法时,就等于对这个对象上了锁,钥匙就在这个线程手中,在未执行完这个方法以前, ...

哦,好的,多谢哦~
作者: 柳汉杰    时间: 2013-5-6 18:40
本帖最后由 柳汉杰 于 2013-5-6 18:42 编辑


一个对象的一个synchronized方法只能由一个线程访问,对象的synchronized方法不能进入了,但它的其他方法还是可以访问的。

在synchronized方法引用了一个全局的变量,synchronized方法还没有运行完成的期间,在另外的一个方法中就可以修改synchronized方法的这个变量

例如:
    A和B 一起去吃饭,在进一个大门,A站在门口不进去,B就不能进去,但是现在有个专门的老师通道,C老师和B玩得好,C就可以把B带从老师通道进去



1.当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块;然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
2.但当synchronizized中的锁是不相同的时候,其它线程是否可进入此对象的其它方法!
所以在用synchronizized的时候,必须用相同的锁!

两个说的都挺好的




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