标签:线程 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