湖南网站建设平台wordpress备份还原
2026/4/10 9:37:54 网站建设 项目流程
湖南网站建设平台,wordpress备份还原,学校门户网站建设报告,招商加盟网站建设目的以下是一篇尽量通俗、结构清晰的文章#xff0c;帮助你真正搞懂#xff1a; Java 线程的 6 种状态 状态转换图 以及 Java 内存模型#xff08;JMM#xff09;最核心的几件事 一、线程的 6 种状态#xff08;Java Thread.State 枚举#xff09; Java 线程在 JVM 层面一…以下是一篇尽量通俗、结构清晰的文章帮助你真正搞懂Java 线程的 6 种状态 状态转换图以及 Java 内存模型JMM最核心的几件事一、线程的 6 种状态Java Thread.State 枚举Java 线程在 JVM 层面一共有这 6 种状态状态英文中文名称是否占用 CPU是否持有锁通俗解释NEW新建否否刚 new Thread() 出来还没调用 start()相当于一张还没发出去的简历RUNNABLE可运行是有可能可能线程正在 JVM 里“活着”要么正在 CPU 上跑要么在就绪队列排队等 CPUBLOCKED阻塞锁等待否否想进 synchronized 代码块但锁被别人拿着像在银行排队等叫号WAITING无限等待否否调用了 wait()、join()、LockSupport.park() 后进入像睡着了等别人叫醒TIMED_WAITING限时等待否否带时间的 wait(long)、sleep(long)、join(long)、parkNanos/parkUntilTERMINATED终止否否run() 方法执行完毕正常结束或异常抛出未捕获线程彻底死亡最容易混淆的三个状态对比状态对比BLOCKEDWAITINGTIMED_WAITING等待什么等待 monitor 锁等待别人主动唤醒等待别人唤醒 或 超时自动醒典型方法synchronized 块入口wait() / join() / park()sleep() / wait(时间) / join(时间)持有锁情况不持有没抢到不持有已经释放不持有已经释放被唤醒方式锁释放后自动竞争notify / notifyAll / unparknotify / 超时 / unpark二、线程状态转换图最经典的 7 条转换路径new Thread() ↓ NEW ↓ start() RUNNABLE ←──────────────┐ / ↑ \ │ / │ \ │ CPU 时间片用完 / yield() 运行中 ←───── 就绪 等待锁 │ \ │ / │ \ ↓ / │ BLOCKED ←──── WAITING ←── TIMED_WAITING ↑ ↑ ↑ │ │ │ notify/notifyAll wait() sleep(时间)/wait(时间) │ │ │ └────────┴─────────────┘ ↓ TERMINATED最常考的几条路径解释通俗版NEW → RUNNABLE调用start()线程进入就绪队列排队等 CPU不是立刻执行RUNNABLE → TERMINATEDrun() 方法正常结束 或 抛出未捕获异常RUNNABLE → BLOCKED线程想进synchronized同步块但发现锁被别人拿着 → 进入阻塞队列RUNNABLE → WAITINGobj.wait()必须先持有锁thread.join()等待目标线程结束LockSupport.park()RUNNABLE → TIMED_WAITINGThread.sleep(毫秒)最常见不释放锁obj.wait(毫秒)thread.join(毫秒)LockSupport.parkNanos()/parkUntil()WAITING / TIMED_WAITING → RUNNABLE被notify/notifyAll唤醒但不一定马上拿到锁被unpark唤醒等待时间到自动唤醒BLOCKED → RUNNABLE锁被释放后JVM 从阻塞队列里挑一个线程去竞争锁不保证公平三、Java 内存模型JMM最核心的几件事通俗版JMM 主要解决两个问题可见性一个线程改了变量另一个线程看不看得见有序性代码写的顺序和实际执行顺序是否一致最核心的三个概念 一张图1. 主内存 vs 工作内存每个线程都有自己的工作内存本地内存里面放的是主内存变量的副本。主内存共享 age 18 money 1000 ↑ ↑ ┌───────────────┬───────────────┐ │ 线程A工作内存 │ 线程B工作内存 │ │ age副本18 │ age副本18 │ │ money副本1000│ money副本1000│ └───────────────┴───────────────┘2. 八大原子操作决定变量什么时候从主内存同步到工作内存操作含义谁发起lock把主内存变量标记为线程独占线程unlock把锁释放线程read从主内存读取变量值线程load把 read 的值放入工作内存副本线程use线程使用工作内存中的变量副本线程assign线程把值赋给工作内存中的变量副本线程store把工作内存副本的值传回主内存线程write把 store 的值写入主内存的变量线程3. happens-before 规则最重要决定“能不能看到修改”只要满足下面任意一条前面的写操作对后面的读操作可见程序顺序规则单线程内按代码顺序执行监视器锁规则解锁 → 同一个锁的加锁volatile 变量规则对 volatile 变量的写 → 后面的读线程启动规则Thread.start() → 线程内的任意操作线程终止规则线程内任意操作 → Thread.isAlive()false / join()返回线程中断规则interrupt() → 检测到中断抛异常或 isInterruptedtrue对象终结规则构造方法结束 → finalize() 开始传递性A 先于 BB 先于 C → A 先于 C最常考的几条通俗解释我对 volatile x 写了 100 → 后面任何线程读 x 都必须是 100我 synchronized 块里改了 age → 出块后别的线程进同一个锁的 synchronized 块一定能看到我调用 t.start() → t 线程里面的代码一定能看到 start() 之前的变量值总结一句话口诀线程状态NEW → start → RUNNABLE ↔ BLOCKED / WAITING / TIMED_WAITING → TERMINATED内存模型每个线程有自己的工作内存 主内存要想让别人看到修改必须走 happens-before 桥梁volatile、synchronized、start/join 等如果你现在能画出线程状态转换图 说出 volatile 为什么能保证可见性 举例 happens-before 的 3 个最常用规则那么这篇内容你就已经掌握 80% 了。需要我再深入讲解哪一块比如volatile 底层实现内存屏障 Lock 前缀synchronized 升级过程偏向锁→轻量级锁→重量级锁JMM 对 double/long 的非原子性处理ThreadLocal 与内存泄漏告诉我我继续给你展开

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询