wordpress 优酷插件南宁百度seo建议

张小明 2026/1/5 17:50:20
wordpress 优酷插件,南宁百度seo建议,关于大创做网站的项目计划书,学网站开发去哪学文章目录 为什么wait()、notify()和notifyAll()必须在同步机制中才能正常运行#xff1f;前言一、让我们先来复习一下基础知识1.1 什么是wait()#xff1f;1.2 notify()的作用1.3 notifyAll()的作用 二、为什么这三个方法必须在同步块中使用#xff1f;2.1 不在同步块中使用…文章目录为什么wait()、notify()和notifyAll()必须在同步机制中才能正常运行前言一、让我们先来复习一下基础知识1.1 什么是wait()1.2 notify()的作用1.3 notifyAll()的作用二、为什么这三个方法必须在同步块中使用2.1 不在同步块中使用会有什么后果2.2 内存可见性问题2.3 解决方案使用synchronized关键字三、总结因此在多线程编程中我们必须严格遵守这些规则以避免潜在的程序 bug。 领取 | 1000 套高质量面试题大合集无套路闫工带你飞一把为什么wait()、notify()和notifyAll()必须在同步机制中才能正常运行前言大家好我是闫工今天我们要探讨一个看似简单却至关重要的问题为什么wait()、notify()和notifyAll()这三个方法必须在同步机制中才能正常工作这个问题听起来好像很简单但其实背后涉及到Java内存模型、线程同步以及锁机制的原理。作为一个有着丰富一线开发经验的老司机今天我来带大家从一个全新的角度理解这个问题。一、让我们先来复习一下基础知识1.1 什么是wait()wait()是Object类中的一个方法它会使得当前线程进入等待状态并释放当前锁。简单来说就是让当前执行的线程暂停执行直到被其他线程唤醒。代码示例publicclassTest{publicstaticvoidmain(String[]args){ObjectlocknewObject();synchronized(lock){// 进入同步块获取锁System.out.println(线程Thread.currentThread().getName()开始等待...);try{lock.wait();// 当前线程进入等待状态并释放锁}catch(InterruptedExceptione){e.printStackTrace();}}}}1.2 notify()的作用notify()同样是Object类中的方法它的作用是唤醒一个正在等待的线程。注意这里说的是“一个”线程而不是全部。代码示例publicclassTest{publicstaticvoidmain(String[]args){ObjectlocknewObject();synchronized(lock){// 获取锁System.out.println(线程Thread.currentThread().getName()正在运行...);try{lock.notify();// 唤醒一个等待的线程}catch(Exceptione){e.printStackTrace();}}}}1.3 notifyAll()的作用notifyAll()与notify()类似但它会唤醒所有正在等待的线程。这意味着如果有多个线程在等待某个锁notifyAll()会让它们全部进入就绪状态。代码示例publicclassTest{publicstaticvoidmain(String[]args){ObjectlocknewObject();synchronized(lock){// 获取锁System.out.println(线程Thread.currentThread().getName()正在运行...);try{lock.notifyAll();// 唤醒所有等待的线程}catch(Exceptione){e.printStackTrace();}}}}二、为什么这三个方法必须在同步块中使用2.1 不在同步块中使用会有什么后果现在我们来探讨关键问题如果不在同步机制中使用这些方法会发生什么假设我们有以下代码publicclassTest{publicstaticvoidmain(String[]args){ObjectlocknewObject();// 注意这里没有加synchronized关键字try{lock.wait();// 不在同步块中调用wait()}catch(InterruptedExceptione){e.printStackTrace();}}}运行这段代码编译器不会报错但运行时会抛出一个IllegalMonitorStateException异常。为什么会这样因为wait()、notify()和notifyAll()都是与锁机制紧密相关的。它们必须在当前线程拥有该对象的锁时才能被调用。如果不在同步块中使用程序就会试图操作一个没有上锁的对象这显然是不安全的。2.2 内存可见性问题如果我们不使用同步机制就无法保证内存可见性。例如假设有两个线程A和B线程A修改了一个共享变量。线程B试图读取这个变量。如果没有同步机制线程B可能读取到的是一个过时的值因为Java虚拟机JVM可能会缓存这个变量。这就是所谓的内存可见性问题。示例代码publicclassTest{privatebooleanflagfalse;publicstaticvoidmain(String[]args)throwsInterruptedException{TesttestnewTest();ThreadthreadAnewThread(()-{try{// 线程A的逻辑System.out.println(线程A开始运行...);test.flagtrue;// 修改共享变量System.out.println(线程A修改了flag的值为true...);test.lock.wait();// 不在同步块中调用wait()}catch(InterruptedExceptione){e.printStackTrace();}});ThreadthreadBnewThread(()-{try{// 线程B的逻辑System.out.println(线程B开始运行...);while(!test.flag){// 试图读取共享变量System.out.println(线程B正在等待flag变为true...);Thread.sleep(100);}System.out.println(线程B检测到flag为true继续执行...);}catch(InterruptedExceptione){e.printStackTrace();}});threadA.start();threadB.start();}}运行这段代码可能会出现以下情况线程B可能永远无法读取到flag的最新值即true导致无限循环。这是因为没有同步机制线程B无法看到线程A对共享变量所做的修改。这就是内存可见性问题的一个典型表现。2.3 解决方案使用synchronized关键字为了解决上述问题我们需要将这些方法放在同步块中以确保内存可见性和互斥访问。修改后的代码publicclassTest{privatebooleanflagfalse;publicstaticvoidmain(String[]args)throwsInterruptedException{TesttestnewTest();ThreadthreadAnewThread(()-{synchronized(test){// 使用synchronized关键字try{System.out.println(线程A开始运行...);test.flagtrue;// 修改共享变量System.out.println(线程A修改了flag的值为true...);test.lock.wait();// 在同步块中调用wait()}catch(InterruptedExceptione){e.printStackTrace();}}});ThreadthreadBnewThread(()-{synchronized(test){// 使用synchronized关键字try{System.out.println(线程B开始运行...);while(!test.flag){// 试图读取共享变量System.out.println(线程B正在等待flag变为true...);test.lock.wait();// 在同步块中调用wait()}System.out.println(线程B检测到flag为true继续执行...);}catch(InterruptedExceptione){e.printStackTrace();}}});threadA.start();threadB.start();}}现在当线程A修改了flag的值后它会调用wait()并释放锁。此时线程B可以获取到这个锁并读取到最新的flag值。三、总结通过上述分析我们可以得出以下结论wait()、notify()和notifyAll()必须在同步块中使用否则会导致IllegalMonitorStateException异常。不在同步块中使用这些方法可能会导致内存可见性问题从而引发程序逻辑错误。使用synchronized关键字可以确保线程之间的互斥访问和内存可见性。因此在多线程编程中我们必须严格遵守这些规则以避免潜在的程序 bug。 领取 | 1000 套高质量面试题大合集无套路闫工带你飞一把成体系的面试题无论你是大佬还是小白都需要一套JAVA体系的面试题我已经上岸了你也想上岸吗闫工精心准备了程序准备面试想系统提升技术实力闫工精心整理了1000 套涵盖前端、后端、算法、数据库、操作系统、网络、设计模式等方向的面试真题 详细解析并附赠高频考点总结、简历模板、面经合集等实用资料✅ 覆盖大厂高频题型✅ 按知识点分类查漏补缺超方便✅ 持续更新助你拿下心仪 Offer免费领取 点击这里获取资料已帮助数千位开发者成功上岸下一个就是你✨
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

怎么做网站服务器吗做动漫主题的网站

Linly-Talker 支持多摄像头视角切换输出 在虚拟主播直播越来越依赖视觉表现力的今天,一个简单的静态画面已经难以满足观众对内容节奏和信息密度的需求。想象一下:当数字人讲解到关键知识点时,镜头自动推近为特写;情绪激昂时切换为…

张小明 2026/1/2 23:16:20 网站建设

建站主机 wordpress自己做网站外包

PyTorch损失函数详解:选择合适的Loss提升模型精度 在深度学习的实际项目中,我们常常会遇到这样的情况:模型结构设计得再精巧,训练数据再充足,但如果损失函数选错了,最终结果可能依然惨不忍睹——分类任务把…

张小明 2026/1/2 12:17:46 网站建设

做有网被视频网站有哪些wordpress创建主题

DataV数据可视化:5分钟从零打造惊艳企业大屏 【免费下载链接】DataV 项目地址: https://gitcode.com/gh_mirrors/dat/DataV 还在为复杂的数据展示头疼吗?DataV作为一款强大的Vue数据可视化组件库,让你无需编写繁琐代码,快…

张小明 2026/1/3 2:41:02 网站建设

设计用的报价网站邯郸网站建设设计

Il2CppDumper:5步轻松掌握Unity游戏逆向工程 【免费下载链接】Il2CppDumperunity游戏修改工具介绍 Il2CppDumper是一款专为Unity游戏逆向工程设计的实用工具。它能够读取游戏中的global-metadata.dat文件,并结合libil2cpp.so,帮助开发者轻松提…

张小明 2026/1/2 23:39:18 网站建设

公司网站推广如何做网页设计展示图

Anything-LLM:让企业文化“会说话”的智能中枢 在每年春节临近时,HR部门总要面对相似的场景:一封长达十几页的《节日活动安排通知》发到全员群后,不到半小时,各种重复问题就开始刷屏——“年会几点开始?”“…

张小明 2026/1/2 19:43:07 网站建设

个人网站有什么用yy直播赚钱吗

ASMR音频资源高效获取全攻略:专业下载工具深度解析 【免费下载链接】asmr-downloader A tool for download asmr media from asmr.one(Thanks for the asmr.one) 项目地址: https://gitcode.com/gh_mirrors/as/asmr-downloader 在当今快节奏生活中&#xff0…

张小明 2026/1/3 9:12:13 网站建设