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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 袁园 中级黑马   /  2012-11-24 09:21  /  1408 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一个有线程锁的函数,但是里边又要用sleep   不是就把锁给打乱了  还是整个cup都等睡眠时间过了以后才开始执行?

public synchronized  void run(){
sleep(1000);
}

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

3 个回复

倒序浏览
这个没有关系,线程锁是指多个线程在执行同一代码块的时候,保证他们能单独的执行,不互相之间影响.比如说当线程A进入同步函数它就持有当前对象的字节码文件对象的锁.其他线程想要执行这些代码,就只有等他释放了这把锁,才能有机会去执行.
就好像你去上厕所,只有等厕所里面的人出来了就才嫩进去一样.

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
这个线程拿到了锁,那么它就是运行状态,其他线程就是就绪状态。他sleep了,但是锁没有释放啊,那么其他线程也没有拿到锁,只能等啊,那么就还是就绪状态啊。并不是说CPU睡着了,而是线程。
毕老师的经典例子嘛,火车里的厕所。
这人拿到锁,进去后转动锁,锁上面写上‘有人’,但是这人一转身被熏晕了,那他就SLEEP了。厕所是CPU,厕所是不会sleep的。
那么外面的人只能等着,呵呵!!外面的人就是就绪状态。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
public synchronized  void run(){    //这句话的意识是说告诉其他的线程我已经进来,其他的线程看见已经被锁上了 就不能再进去了
sleep(1000);                        //而这句话是说进去了之后,让自己休眠1000毫秒,休眠之后,它再运行,
}                                      //其实并没与混乱的,因sleep是指对当前线程做的动作,而synchornized是其实线程锁,也就是说,一个线程执行了另外一个线程就没办法去执行,只能进行等待,钱一个线程执行完另外的才能进去执行
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马