再谈关于 java 线程,synchronized,wait,notify

27 篇文章 0 订阅
1 篇文章 0 订阅

<★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 的线程。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值