以下内容均由本人独立完成,希望你看完之后能有更多更深入的了解,欢迎关注➕

目录

1、线程Thread 生命周期 & 基本使用

2、锁

3、Object 的wait 和 notify 方法

进程是资源分配的最小单元,线程是程序执行的最小单元,通常在一个进程中包含了多个线程。单个CPU在一个时刻只能把时间片分配给一个线程去执行。线程的整个生命周期包含了多个状态,未运行的初始状态,启动后未获取CPU时间片的待运行状态,任务执行完成后的消亡态,和线程紧密工作的锁又是如何控制线程的进入和退出的,接下来就学习和了解下Java的线程和锁的基本特点。

1、线程Thread 生命周期 & 基本使用

线程类中包含了多种状态,可通过getState方法获取到State枚举类信息

public enum State { NEW,  RUNNABLE, BLOCKED,  WAITING,  TIMED_WAITING,  TERMINATED;}

NEW:线程还未开始的状态

RUNNABLE:在JVM中是运行的状态,但真正执行需要操作系统分配必须的资源才可运行

BLOCKED:等待Monitor Lock(监视器锁) 被阻塞导致,例如synchronized

WAITING:因为非时间因素导致线程等待的,例如Object.wait()、Thread.join()、LockSupport.park()等

TIMED_WAITING:因为时间因素导致线程等待的,例如Thread.sleep()、Object.wait(time)、Thread.join(time)等

TERMINATED:线程执行完成,消亡状态了

实际状态流转中每一种状态的变更都是有着其具体的原因,例如Object.wait()方法执行后,线程一方面会自行暂停,另一方面会进入到当前对象的一个等待集合中,等待超时、notify唤醒又或者中断引发的中断时间而离开等待集合,如下图可能可以更好的说明线程的流转关系。

具体方法以及相关关键字在后面再做介绍,先了解下线程如何使用的,线程的使用有两种方法,继承Thread 类实现Runnable 接口,都是重写run方法,Runnable更多的可以看做是一个Task任务,任务可以交由任何可执行的线程去执行,但是继承Thread的在一创建时就已经固定了,没有足够的灵活性,推荐使用Runnable

用java8最新的lambda表达式也可以很方便的写成Runnable runnable = () -> {/* run方法运行实体*/},然后直接交给Thread执行即可。

请勿直接调用线程的run方法,那样无法创建新线程执行。调用start方法会由native方法创建新线程然后调用run方法

2、锁

现实中我们也大量的应用到锁,为了防止家里的财产被盗,离开家门时会锁门,日常用的电脑为了确保资料安全也会给自己的账户设置个密码锁,不过这也意味着我们日常外出需要带着钥匙,记住密码,要不然会导致很多不必要的麻烦。和实际生活一样,Java中的锁也是为了保证数据(服务)安全,也会对服务的性能、吞吐量等造成影响。

那锁是什么呢?

  • Java中的一切都是对象,锁也不例外,这个被锁的对象只能由锁保护资源所在的线程去访问
  • 锁可以控制对数据访问的先后顺序(强行串行化)
  • 锁可以控制对数据是否拥有访问权
  • 锁可以控制服务的活跃性问题
  • 锁也可以抑制指令重排(降低效率)

常见的锁种类

  1. synchronized:Java原生语义支持的,内置锁,可重入,悲观的,在JDK1.5以后synchronized在不同情况下从 无锁->偏向锁->轻量级所->重量级锁的转变。
  2. ReentrantLock:基于AQS开发的可重入锁,有公平和非公平之分,也可以感知到中断
  3. CountDownLatch:基于AQS开发的锁,也叫计时器锁,当计数器减为0后,就可以执行其他任务了,不可重置
  4. CyclicBarrier:同样是基于AQS开发的锁,也叫栅栏锁,有换代的操作,可重置(想象成多个栅栏一般)
  5. Condition:条件锁,用在阻塞队列中,可控制消费者和生产者的读取进度
  6. ReentrantReadWriteLock:读写锁,读和写拆开,可以极大的提高读多写少的场景下的性能

对象锁对应的监视器锁结构如下图所示

本图来自:https://www.programcreek.com/2011/12/monitors-java-synchronization-mechanism/

  1. Special Room:当前运行的线程所存储的地方
  2. Entry Set: 所有需要获取当前锁的线程存储的地方
  3. Wait Set:所有被调用wait方法的线程存储的地方

3、Object 的wait 和 notify 方法

wait、notify方法是Object类的final native方法,不能被重写,而且必须有同步器synchronize的辅助才可以使用(这个是JVM规定的)

 synchronized (OBJ) { try { while (count <=0) { // 当前线程暂停执行 OBJ.wait(); } ...... // 具体的任务 OBJ.notify(); // 唤醒其他线程工作 } catch (InterruptedException e1) { e1.printStackTrace(); // 由wait方法触发的中断 } }

wait方法是用来释放锁并且暂停服务的,从上面的线程流转图也可以看出来,对象调用wait()方法后,当前执行的线程会进入到当前对象的监视器对象的Wait Set区域内,执行notify方法,会从Wait Set集合中随便挑选一个然后唤醒操作进入到Entry Set集合中,后续的具体执行还得看具体的资源分配等情况,notifyAll方法可以唤醒所有等待的线程,至于那一个现在真正的执行同样也是无法感知的。

kali锁屏后无法唤醒_看一下吧,自己对线程以及锁的概念和原理了解是否正确...相关推荐

  1. kali锁屏后无法唤醒_联想电脑锁屏后无法唤醒_win10联想休眠怎么唤醒黑屏图文步骤...

    2020-02-15 12:59:37 大家在使用电脑时为了保护电脑的安全,我们一般会设置密码.那么之后我们开机或者唤醒睡眠的时候,往往会先弹出一个锁屏界面.但有的网友却觉得这样很是麻烦,想要关闭锁屏 ...

  2. kali锁屏后无法唤醒_面试官:说一下公平锁和非公平锁的区别?

    前言 上次我们提到了乐观锁和悲观锁,那我们知道锁的类型还有很多种,我们今天简单聊一下,公平锁和非公平锁两口子,以及他们在我们代码中的实践. 正文 开始聊之前,我先大概说一下他们两者的定义,帮大家回顾或 ...

  3. (已解决)win10+ubuntu18.04双系统,ubuntu锁屏后无法唤醒,重启黑屏闪烁无法进入命令行模式

    事发经过: 台式机双系统 win10 + Ubuntu16.04,大部分时间在Ubuntu16.04下工作.一个不小心(dist-upgrade)升级到了ubuntu18.04后,在一次锁屏后发现再也 ...

  4. linux(Debian11)休眠锁屏后无法唤醒

    原文:[Debian10]intel核显使用xfce锁屏会黑屏无法唤醒解决方案 - Daniel_Luo - 博客园 intel核显笔记本安装了debian10.使用的是xfce的桌面环境.但是xfc ...

  5. win10锁屏后默认1分钟进入睡眠状态的解决办法

    问题描述 先说一下睡眠和关闭显示器的区别:睡眠时系统中的一部分程序会停止工作,当你唤醒时会有卡顿感.而关闭显示器的话,其实程序还是在工作的,仅仅是不显示了.从仅关闭显示器的状态唤醒时,体验会比较流畅. ...

  6. 使用AlarmManager实现定时提醒,解决锁屏后无法正常唤醒CPU和屏幕的问题

    之前写过一个demo来实现定时操作,最近帮别人写项目的时候又用到了这个需求,于是coding起来. 首先来说一下我的实现思路:用户选择好闹钟提醒时间后我要启动一个Service,在这个Service里 ...

  7. 手机关机收不到微信消息_手机锁屏后收不到微信消息是怎么回事?

    展开全部 一.网络延迟 在没有接收到微信消息通知,网络延迟占了相当大的比例.使用手机时62616964757a686964616fe4b893e5b19e31333433623139,如果当时的网络信 ...

  8. 小米笔记本锁屏睡眠无法唤醒修复方法

    更新显卡驱动 经过测试修改Win10电源管理计划关闭睡眠依旧会导致锁屏一段时间后键盘亮.屏幕不亮的问题,只能强制重新启动. 排查后发现是旧版intel集成显卡驱动有bug,更新到最新版可以避免这种情况 ...

  9. Android 基于高德地图的锁屏后定位和轨迹自动纠偏(离线版)

    目录 一.后台如何持续获取定位 1.后台以及锁屏后持续定位异常的原因以及应对方案探索 2.后台持续获取定位失败的应对方案 二.对坐标点进行加工处理 (1).为什么要加工处理 (2).如何加工处理 本文 ...

最新文章

  1. 水星记(Mercury Records)
  2. 我的FizzBuzz和一点感想
  3. js中图片显示用ajax,javascript - 前台用ajax上传图片,怎么让图片上传完成显示的缩略图片的时候显示分辨率大小...
  4. 【网络安全威胁】企业风险远不止勒索软件,盘点当今企业面临的四种安全威胁
  5. linux随机10字母病毒
  6. undefined和null
  7. Python解释器和IPython
  8. 2014-2-28 思杨的语言能力
  9. java原生方法,Java Servlet原生调用方法过程简化
  10. java 8进制串转中文_为什么不能用中文进行编程?而英文就可以
  11. 如何有效的为Windows XP减肥
  12. Infopath2007表单转化成word2007
  13. 提示GuestAdditions versions on your host (6.1.32) and guest (6.1.22) do not match错误的解决方法
  14. 杭州辣府餐饮JAVA_超全“滨江美食必打卡list”,不收藏会后悔!年前再去搓几顿啊~...
  15. tensorflow计算flops
  16. Mac配置mysql环境
  17. IEEE xplore免费下载论文
  18. 渗透测试——sql注入进阶/基于时间的盲注/一看就会/
  19. 《PHP程序员面试笔试宝典》——如何克服面试中紧张的情绪?
  20. 鸿蒙攻势凌厉,谷歌被迫另寻出路,与印度企业合作研发低端手机

热门文章

  1. Django:模型层ORM
  2. 虚拟机安装docker_Docker 从入门到放弃:新手学习笔记(上)
  3. python 列表为空_如果列表为空,则Python返回False
  4. 制作不同方向的三角形(border属性)
  5. 解析几何的解读(二)
  6. c语言 统计数量用count_c语言中统计重复数字次数 c语言问题 统计不同数字的个数...
  7. 为啥我从后台查到的值在页面显示的是undefined_短说开发日报:2.7版本后台财务管理(11.19周四)...
  8. 搭建自己的Unity Package
  9. android 下载视频文件怎么打开,安卓手机支付宝文件夹下的视频文件是什么
  10. 使用Seaborn和Pandas进行数据可视化