码迷,mamicode.com
首页 > 编程语言 > 详细

再谈关于 java 线程,synchronized,wait,notify 的问题

时间:2015-03-31 09:12:04      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:线程   java   synchronized   wait   notify   

<★cnmm22 动感原创:http://blog.csdn.net/cnmm22/article/details/44758269>


在我的上一篇博客里<http://blog.csdn.net/cnmm22/article/details/44273843>,我谈到了java 的线程,和线程同步的问题,但是我想了一下,可能并没有把有些事情说清楚。


既然没说清楚,所以我再谈谈。


首先,synchronized 只有一个作用,就是保证其中的代码块不被打断。


那说了,有synchronized 就行了,为啥要在后面加个小尾巴?synchronized(对象锁)?这个笔对象锁又是拿来干嘛呢?


要解释这个问题不能单靠理论,而网上所有的关于这个问题都会把重点放到理论上。我现在要把你的重点引到实际应用中去,要站到设计者的角度来考虑这个问题,


假设一个程序,无须多线程,那自然是从上到下的顺序执行。


而所有用到 synchronized  的地方,必然是有多个线程,程序不再像单线程那样简单。


这就引来一个实际的问题:synchronized 会降低程序执行效率,因为,为了保证其中的代码块被完整的执行,其他的线程可能必须要等待。


那设计者自然要想了:为了保证 synchronized 的代码块完整执行,是大家都等呢,还是只是一些相关程序等呢?


问题中已经包含了答案。


那说了,怎样判断哪些程序是相关的呢?对象锁。


至于这个问题:为啥有 wait,notify 的地方必须有synchronized?


因为必须有线程跟这些 wait 的线程拥有同样的线程锁来唤醒他们,这句话可能很难理解,但你找找你会发现:有wait的程序,一个线程往往会被创建多个实例,就比如我上一讲里的代码1,他们很显然能够拥有相同对象锁;或者必须有多个线程拥有同一个对象锁,就比如我上一讲里的代码2。


嘿,你说奇怪了,其实一点都不奇怪,很好理解,我可以明确告诉你,不可能有一个单线程程序里有 wait 这类代码的出现,因为要是真这样,线程一但wait ,再也没人叫醒他了,绝不可能有这样的程序出现。


我举个例,假设你要在一个游戏写一个暂停游戏,这必须用到 wait,同时,你必须用一个跟他持有相同对象锁的线程唤醒它。那个线程通常一个按键监听线程,你必须要证明一件事才能相信我说的,那就是游戏的主线程和按键监听线程不是同一个线程,但是可以是一组相关线程(这个很简单,只要有相同的对象锁就可以)。


你可以去试一试,在java 里,按键是有是一个专门线程,通常是 AWT-EventQueue-0 这样的后台线程,而你写的代码是在另一个线程里运行。


所以,实际当你的游戏暂停时,不是所有所有都暂停了,这也等于解释了一个线程 wait的时候,必然有其他的线程醒着,来在合适的时候叫醒哪些 wait 的线程。




再谈关于 java 线程,synchronized,wait,notify 的问题

标签:线程   java   synchronized   wait   notify   

原文地址:http://blog.csdn.net/cnmm22/article/details/44758269

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!