JAVA 线程状态以及synchronized,wait,sleep,yield,notify,notifyAll
java线程存在以下几种状态:
1: 创建状态(New):线程被new出来,还未调用start
2: 就绪状态(Runnable):又称为可执行状态,调用线程的start方法后,线程处于就绪状态,,线程调度程序还未给该线程分配cpu时间片执行。
3: 运行状态(Running):线程调度程序分配cpu时间片来执行线程代码。
4: 阻塞状态(Blocked):线程在运行过程中由于某种原因暂停运行进入阻塞状态,只有满足条件后进入就绪状态,获取cpu后才能再次进入运行状态。
阻塞的情况分三种:
A:等待阻塞(wait):调用wait()方法,与synchroined一起使用,线程进入对象等待池,释放synchroined的锁,处于阻塞状态。当有其他线程notify,notifyAll后线
进入锁标识等待池,即进入同步阻塞状态。
B:同步阻塞:线程运行过程中需要获取锁,但该锁被其他线程持有,则该线程进入锁标识等待池,处于同步阻塞状态。当线程获取锁之后,线程进入就绪状态。
C:其他阻塞:当线程sleep,或者join,或者发出I/O请求后,知道yield时间到,sleep时间到,join的线程执行完,或者I/O返回后,线程进入就绪状态。
5: 死亡状态(Dead):当线程Run方法退出或者运行出现异常线程停止时,线程就会消亡。
synchronized有两种用法,
一种是写在方法前,如果该方法是静态方法,则获取的锁是类锁,多线程调用该类中所有的实例的该方法都是互斥的。如果该方法不是静态的,则获取的锁是对象锁,多线程调用同一个实例的该方法是互斥的,调用不同实例则不是互斥的。
一种是同步代码块:synchronized(){//....},同样根据方法是否是静态方法区分获取对象锁还是类锁。
wait:与synchronized一起使用,即必须想获取指定的锁lock,才能lock.wait。wait时,会释放lock,线程进入对象等待池,释放synchroined的锁,处于阻塞状态。当有其他线程notify,notifyAll后线 进入锁标识等待池,即进入同步阻塞状态。
notify:与synchronized一起使用,即必须想获取指定的锁lock,才能lock.notify,synchronized代码块结束后释放锁,通知一个因lock而进入等待阻塞的线程进入同步阻塞状态。
notifyAll:与synchronized一起使用,即必须想获取指定的锁lock,才能lock.notifyAll,synchronized代码块结束后释放锁,会通知所有因Lock而进入等待阻塞的线程进入同步阻塞状态。
sleep:线程暂停运行,进入阻塞状态,但不会释放之前持有的锁,sleep能够让低优先级的线程有机会运行。
yield:线程进入就绪状态,不会释放锁,让同优先级的其他线程有机会运行。但下次可能继续分配cpu时间片,进入运行状态。
join:让一个线程B加入到一个线程A的尾部,在A运行完前,B不能运行。
最新文章
- 转载:《TypeScript 中文入门教程》 14、输入.d.ts文件
- jQuery学习笔记(在js中增加、删除及定位控件的操作)
- ASP.NET ZERO 学习 HangFire的使用二
- 在ORACLE触发器里调用JAVA程序
- html5.js让IE(包括IE6)支持HTML5元素方法
- 【转】使用json-lib进行Java和JSON之间的转换
- Scala初体验
- sublime 复制黏贴等快捷键修改
- http_build_query函数(学习)
- Leetcode 解题 Add Two Numbers Python
- Android 传感器开发
- oracle即时客户端安装方法
- 读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字。 输入格式:每个测试输入包含1个测试用例,即给出自然数n的值。这里保证n小于10的100次幂。 输出格式:在一行内输出n的各位数字之和的每一位,拼音数字间有1 空格,但一行中最后一个拼音数字后没有空格。 输入样例: 1234567890987654321123456789 输出样例: yi san wu
- Luogu4363 [九省联考2018]一双木棋chess 【状压DP】【进制转换】
- 什么时候Python的List,Tuple最后一个Item后面要加上一个逗号
- 可视化svg深入理解viewport、viewbox、preserveaspectradio
- vue 路由拦截、axios请求拦截
- 第 6 章 存储 - 040 - docker managed volume
- OPENWRT路由3G拔号实验
- CentOS 7下的KVM网卡配置为千兆网卡
热门文章
- Js 获取 本周、本月起始时间
- Shortcut Collapse project or projects in the Solution Explorer Microsoft Visual Studio 2008
- window scipy install
- 工欲善其事必先利其器-Notepad++使用小记(Python)
- iOS: 学习笔记, swift扩展
- norflash移植及uboot 保存环境变量实验
- js共享onload事件
- Data Guard配置后续检查
- 利用jquery操作Radio方法小结
- Tomcat架构(二)