4赞
553
当前位置:  开发笔记 > 编程语言 > 正文

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

我可以明确告诉你,不可能有一个单线程程序里有wait这类代码的出现,因为要是真这样,线程一但wait,再也没人叫醒他了,绝不可能有这

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


在我的上一篇博客里,我谈到了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 的问题


推荐阅读
  • ContactsAcore进程,在内存较少和开机进程过多的情况下会常常被ActivityManagerKill掉。导致Sim卡联系人开机后未导入或者仅仅导入一部分,造成联系人丢失的 ... [详细]
  • 函数一、函数是什么定义:函数是指一组语句的集合通过一个名字(函数名)封装起来,想要执行这个函数,只需要调用函数名即可。C中的函数叫function,java中的函数叫method, ... [详细]
  • 易悦科技专注于020企业,重运营,垂直于互联网+大消费领域。是全球领先的互联网+大消费领域服务商。旗下拥有奔跑 ... [详细]
  • 1.ip地址:(门牌号)在网络中每台计算机都必须有一个的IP地址;32位,4个字节,常用点分十进制的格式表示,例如:192.168.1.100127.0.0.1是固定ip地址,代表 ... [详细]
  • 08动作系统(二)使用即时动作
    前一篇文章大致理解了动作系统的结构,今天先学习一个简单的即时动作如何使用。首先使用配置好的环境创建一个项目DemoActionInstant命令:python create_pr ... [详细]
  • 产品利益相关者:用户:所有教师顾客:所有学生软件工程师:系统开发,推广,维护人员四象限法功能分类第二象限登录界面简洁,登陆响应速度快,录入成绩速度快,查询速度快等等。第一象限系统可 ... [详细]
  • ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 24. Logging
    常用的诊断中间件:UseDeveloperExceptionPageUseStatusCodePages:返回400~600的状态码UseExceptionHandler自定义异常 ... [详细]
  • 转载请注明出处:王亟亟的大牛之路5号的时候把自己的老版工具类贴了出来,然后今天上午又加了一点内容进去,然后也是简单的几个Button跑下,看看效果。 新增了两个类,一个手机信息类, ... [详细]
  • http:s-macke.github.iojor1kdemosmain.html?userMP10ocGujo&cpuasm&n1&relayURLwss%3A%2F%2Frel ... [详细]
  • 信息系统项目管理师考试是计算机软件水平考试中的一个高级资格考试,是软考中的大热门。信息系统项目管理师证书含金量高,可以评高级职称,是申请高级项目经理的必要条件,还可以挂靠。下面希赛 ... [详细]
  • 半小时前,一个项目反馈应用系统部分功能报错,ORA-03113:通信通道的文件结尾。好像是个常见的错误。异常信息:ORA-03113:通信通道的文件结尾进程ID:2392会话ID: ... [详细]
  • 近期分享干货,使用python实现语音文件的特征提取方法
    python编程语言无疑是人工智能最重要的语言之一,但是其中语音识别是当前人工智能比较热门的方向,百度的小度机器人、阿里的天猫精灵等其他各大公司都推出了各自的语音助手机器人,其识别 ... [详细]
  • 快速搭建LAMP环境
    快速搭建LAMP环境Linux+Apache+MySQL+PHP一组常用来搭建动态网站或者服务器的开源软件,本身都是各自独立的程序,但是因为常被放在一起使用,拥有了越来越高的兼容度 ... [详细]
  • Windows、Linux、ARM、Android、iOS全平台支持的RTMP推流组件EasyRTMPiOS如何接入软编码?
    视频流媒体中视频数据的传输占据了绝大部分的带宽,如何提升编码效率、减小带宽使用、提升画面质量,成为音视频开发者努力的重点。随着互联网、流媒体技术的发展,兼容支持H.264、H.26 ... [详细]
  • 一、新建工程 具体安装和新建工程的方法在cocos2dx目录下的README.md文件中已经有详细说明,这里只做简单介绍。 1、上官网下载cocos2dx-3.0的源码,http: ... [详细]
author-avatar
YANGYANG.
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有