大庆百度公司网站建设做响应式网站的体会

张小明 2026/1/9 6:41:21
大庆百度公司网站建设,做响应式网站的体会,中文网站域名注册,鲜花销售网站开发费用文章目录 Java面试#xff1a;并发编程三要素你真的掌握了么#xff1f;一、为什么并发编程这么难#xff1f;二、原子性#xff1a;我要一口气做完这件事什么是原子性#xff1f;1. 使用 synchronized 关键字2. 使用不可中断的操作#xff08;如加法#xff09;3. 使用…文章目录Java面试并发编程三要素你真的掌握了么一、为什么并发编程这么难二、原子性我要一口气做完这件事什么是原子性1. 使用 synchronized 关键字2. 使用不可中断的操作如加法3. 使用 AtomicInteger 类三、可见性我要让所有人看到我做的修改什么是可见性1. 使用 volatile 关键字2. 使用 synchronized3. 使用 Atomic系列类四、有序性我要按顺序执行什么是有序性如何保证有序性1. 使用 synchronized2. 使用 volatile 和 final 关键字3. 使用 Thread.sleep()五、总结希望这篇文章能帮助你更好地理解并发编程中的原子性、可见性和有序性问题 领取 | 1000 套高质量面试题大合集无套路闫工带你飞一把Java面试并发编程三要素你真的掌握了么大家好我是闫工今天咱们来聊一聊Java面试中必问的并发编程三要素——原子性、可见性和有序性。这三个概念看似简单但很多同学在实际应用中还是容易搞混或者理解不深入导致面试时被问住。别担心闫工带你一步步拆解这些知识点保证你不仅能背出来还能灵活运用一、为什么并发编程这么难在开始正题之前闫工先抛一个问题为什么并发编程这么难想象一下我们平时写代码的时候程序是按顺序执行的。比如A操作执行完之后接着执行B操作中间不会有其他人插队或者打断。但在并发环境下多个线程同时运行可能会有以下问题原子性问题一个操作本来应该是不可分割的整体比如读取和修改一个变量但由于多个线程的干扰导致这个操作被“拆开”了。可见性问题一个线程对共享变量的修改其他线程可能看不到或者看到的是过时的数据。有序性问题由于编译器优化或CPU指令重排代码的实际执行顺序可能与你写的顺序不一致。这些问题会导致我们的程序出现各种奇怪的现象比如数据不一致、逻辑错误等。因此要想写出正确的并发程序必须掌握这三个要素二、原子性我要一口气做完这件事什么是原子性原子性指的是一个操作要么完全执行要么完全不执行不会被中断或部分执行。就像我们常说的“交易要么成功要么失败”没有第三种可能。在Java中如何保证原子性呢主要有以下几种方式1. 使用 synchronized 关键字synchronized 是Java中最常用的同步机制。它可以修饰方法或者代码块确保同一时间只有一个线程可以执行被synchronized保护的代码。publicclassAtomicExample{privateintcount0;publicsynchronizedvoidincrement(){count;}}闫工提醒虽然 synchronized 简单易用但它可能会导致性能问题。如果需要更高的性能可以考虑使用更细粒度的锁机制比如 ReentrantLock。2. 使用不可中断的操作如加法某些操作本身是原子性的不需要额外的同步措施。例如对一个32位整数进行加法操作在Java中是一个原子操作因为JVM保证了这种操作的原子性。publicclassAtomicExample{privateintcount0;publicvoidincrement(){// 这是一个原子操作count;}}3. 使用 AtomicInteger 类从Java 1.5开始提供了Atomic系列类如AtomicInteger、AtomicLong等这些类内部通过CASCompare and Swap算法实现无锁的原子操作。importjava.util.concurrent.atomic.AtomicInteger;publicclassAtomicExample{privateAtomicIntegercountnewAtomicInteger(0);publicvoidincrement(){// CAS算法保证了这个操作的原子性count.getAndIncrement();}}三、可见性我要让所有人看到我做的修改什么是可见性可见性指的是当一个线程对共享变量进行修改后其他线程能够立即看到这个修改。如果不保证可见性可能会出现“脏读”或“旧数据”的问题。在Java中如何解决可见性问题呢主要有以下几种方式1. 使用 volatile 关键字volatile 是一个轻量级的同步机制它确保被修饰的变量对所有线程都是可见的。当一个线程修改了volatile变量后其他线程能够立即看到这个修改。publicclassVisibilityExample{privatevolatilebooleanflagfalse;publicvoidsetFlag(){flagtrue;}publicvoidcheckFlag(){while(!flag){// 等待flag被设置为true}}}闫工提醒虽然 volatile 能保证可见性但它不能保证原子性。比如count这样的操作如果用volatile修饰仍然有可能出现线程安全问题。2. 使用 synchronizedsynchronized不仅能保证原子性还能保证可见性。当一个线程退出synchronized代码块时它会将修改过的共享变量写入主内存并让其他线程看到这些修改。publicclassVisibilityExample{privateintcount0;publicsynchronizedvoidincrement(){count;}publicsynchronizedintgetCount(){returncount;}}3. 使用 Atomic系列类Atomic系列类不仅保证原子性还隐式地保证了可见性。例如getAndIncrement()方法在执行时会确保其他线程能看到最新的值。importjava.util.concurrent.atomic.AtomicInteger;publicclassVisibilityExample{privateAtomicIntegercountnewAtomicInteger(0);publicvoidincrement(){count.getAndIncrement();}}四、有序性我要按顺序执行什么是有序性有序性指的是程序的执行顺序应该与代码书写的顺序一致。但在并发环境下由于编译器优化或CPU指令重排可能会导致实际执行顺序与预期不符。比如下面这段代码看似逻辑清晰但可能因为指令重排导致问题publicclassOrderingExample{inta0;booleanflagfalse;publicvoidwrite(){a1;// 操作1flagtrue;// 操作2}publicvoidread(){if(flag){// 如果看到flag是trueSystem.out.println(a);// 是否能保证a是1}}}在单线程环境下read()方法会输出1。但在多线程环境下由于指令重排可能会出现以下情况操作2设置flag为true被提前执行。read()方法先读到flag是true然后去读a的值这时候a可能还没有被赋值。因此我们需要通过一些机制来保证有序性。如何保证有序性1. 使用 synchronizedsynchronized 不仅能保证原子性和可见性还能确保执行顺序与代码书写的顺序一致。因为当一个线程释放锁时它会将所有修改写入主内存并且其他线程在获取锁之前必须读取最新的值。publicclassOrderingExample{inta0;booleanflagfalse;publicsynchronizedvoidwrite(){a1;// 操作1flagtrue;// 操作2}publicsynchronizedvoidread(){if(flag){// 如果看到flag是trueSystem.out.println(a);// 能保证a是1}}}2. 使用 volatile 和 final 关键字volatile 可以防止指令重排但只能在特定情况下使用。例如如果一个字段被final修饰并且在构造函数中被正确初始化那么其他线程在读取这个字段时能看到最新的值。publicclassOrderingExample{privatefinalinta;privatevolatilebooleanflagfalse;publicOrderingExample(intvalue){this.avalue;// final字段必须在构造函数中赋值this.flagtrue;}publicvoidread(){if(flag){// 能看到a的最新值System.out.println(a);}}}3. 使用 Thread.sleep()虽然不推荐但在某些情况下可以通过让线程暂停一段时间来避免指令重排问题。但这不是一个可靠的解决方案。publicclassOrderingExample{inta0;booleanflagfalse;publicvoidwrite(){a1;// 操作1try{Thread.sleep(1);// 让线程暂停一段时间}catch(InterruptedExceptione){e.printStackTrace();}flagtrue;// 操作2}publicvoidread(){if(flag){// 能看到a的最新值System.out.println(a);}}}五、总结特性synchronizedvolatileAtomic系列类原子性是否是可见性是是但不能保证原子性是有序性是部分支持部分支持隐式通过内存屏障在实际开发中我们需要根据具体需求选择合适的机制。如果需要同时保证原子性和可见性可以考虑使用synchronized或Atomic系列类如果只是简单的可见性问题可以尝试使用volatile。此外还需要注意以下几点避免不必要的同步过多的同步会影响程序性能。合理使用锁粒度尽量缩小锁的范围减少阻塞时间。线程安全数据结构对于集合类可以考虑使用ConcurrentHashMap、CopyOnWriteArrayList等线程安全的数据结构。希望这篇文章能帮助你更好地理解并发编程中的原子性、可见性和有序性问题 领取 | 1000 套高质量面试题大合集无套路闫工带你飞一把成体系的面试题无论你是大佬还是小白都需要一套JAVA体系的面试题我已经上岸了你也想上岸吗闫工精心准备了程序准备面试想系统提升技术实力闫工精心整理了1000 套涵盖前端、后端、算法、数据库、操作系统、网络、设计模式等方向的面试真题 详细解析并附赠高频考点总结、简历模板、面经合集等实用资料✅ 覆盖大厂高频题型✅ 按知识点分类查漏补缺超方便✅ 持续更新助你拿下心仪 Offer免费领取 点击这里获取资料已帮助数千位开发者成功上岸下一个就是你✨
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站挂载时网站建设公司管理

2025年9月,连接亚欧的“钢铁驼队”中欧班列突遇“锁喉危机”——关键口岸被临时关闭,暴露出全球化供应链最脆弱的一环。波兰政府突然关闭边境,导致90%中欧班列必经的“咽喉要道”马拉舍维奇口岸全面瘫痪!300多列货运列车、数万个集…

张小明 2026/1/6 0:58:32 网站建设

pc网站手机版开发网站建设 中国联盟网

HTML表单提交数据?现在用API调用生成语音 在内容创作、在线教育和无障碍服务日益普及的今天,如何快速将一段文字转化为自然流畅的语音,已经成为许多开发者和非技术用户共同关心的问题。过去,我们习惯于通过HTML表单提交文本&#…

张小明 2026/1/7 13:41:32 网站建设

深圳企业网站制作制作网页制作工具的选择与网站整体风格

Windows 2000终端服务安装与应用全解析 1. 终端服务概述 终端服务通过基于服务器的计算模型提供Windows 2000图形用户界面(GUI),为管理员提供对应用程序的共享访问和出色的远程管理能力。在部署Citrix MetaFrame之前,需要先安装Windows 2000终端服务组件,该组件虽为Wind…

张小明 2026/1/7 3:36:40 网站建设

静态网站开发用到的技术有自建服务器做网站的吗

当众多亚马逊卖家专注于竞争激烈的英语主流市场时,德国、日本、法国等小语种站点正悄然成为新的增长蓝海,语言障碍如同高墙,阻挡了许多卖家的拓展步伐。复杂的翻译、文化适配与本地化运营,让许多意图出海的商家望而却步&#xff0…

张小明 2026/1/7 6:14:11 网站建设

沈阳网站关键字优化制作网站入门

React Native Snap Carousel 实战技巧:从入门到精通的避坑指南 【免费下载链接】react-native-snap-carousel 项目地址: https://gitcode.com/gh_mirrors/rea/react-native-snap-carousel 你是否曾经在开发React Native应用时,为寻找一个既美观又…

张小明 2026/1/6 0:55:53 网站建设

织梦网站dw内部网站链接怎么做

第一章:Mac本地部署智谱开源Open-AutoGLM全攻略在 macOS 系统上本地部署智谱开源的 Open-AutoGLM 模型,是实现自动化代码生成与自然语言理解任务的重要一步。该模型基于 GLM 架构,支持多任务推理与代码补全,适合开发者在离线环境下…

张小明 2026/1/7 15:14:34 网站建设