沈阳哪家做网站好企业适合用模板网站

张小明 2025/12/29 20:26:02
沈阳哪家做网站好,企业适合用模板网站,整形网站建设方案策划书,jquery购物网站文章目录一、什么是线程安全#xff1f;从餐厅厨房说起二、线程安全问题的根源#xff1a;计算机底层视角1. 内存可见性问题#xff1a;不只是看不见那么简单2. 竞态条件#xff1a;像抢购限量商品三、Java中的线程安全解决方案1. 内置锁(synchron…文章目录一、什么是线程安全从餐厅厨房说起二、线程安全问题的根源计算机底层视角1. 内存可见性问题不只是看不见那么简单2. 竞态条件像抢购限量商品三、Java中的线程安全解决方案1. 内置锁(synchronized)厨房的专用令牌2. volatile关键字餐厅的中央公告板3. 原子类无锁的智能计数器4. 并发集合线程安全的共享储物柜四、实战场景如何选择正确的线程安全策略场景1计数器高频更新场景2缓存读多写少场景3状态标志简单状态控制五、线程安全的级别从不可变到线程对立六、线程安全的最佳实践七、总结线程安全的终极秘诀参考文章大家好我是你们的后端技术老友科威舟今天给大家分享一下线程安全的原理。多个线程同时访问时如果不需要额外的同步就能正确工作那就是线程安全的——这就像一家和谐的餐厅多位厨师共享厨房却不会互相干扰。作为后端开发者我们常遇到这种情况单线程测试完美的系统在高并发下突然崩溃。这不是系统的缺陷而是线程安全在作祟。今天让我们一起深入探讨线程安全的奥秘。一、什么是线程安全从餐厅厨房说起想象一家繁忙的餐厅厨房多位厨师线程共享使用有限的厨具共享资源和食材数据。如果没有合理规则可能会发生两位厨师同时争抢同一把刀资源竞争一位厨师刚判断汤里需要加盐另一位却把盐用光了竞态条件一位厨师更新了菜单但其他厨师仍按旧菜单准备内存可见性问题在Java世界中一个简单的示例可以说明问题publicclassUnsafeCounter{privateintcount0;publicvoidincrement(){count;// 这不是原子操作}}这个简单的count操作实际上包含三个步骤读取当前值、增加1、写回新值。当多线程同时执行时可能会发生数据丢失现象。二、线程安全问题的根源计算机底层视角1. 内存可见性问题不只是看不见那么简单现代计算机架构中每个CPU都有自己的缓存。当一个线程修改了共享变量该修改可能暂时只存在于当前CPU的缓存中不会立即写回主内存其他线程也就无法立即看到这个变化。publicclassVisibilityProblem{privatestaticbooleanflagfalse;// 缺少volatile关键字publicstaticvoidmain(String[]args){ThreadwriternewThread(()-{try{Thread.sleep(1000);}catch(InterruptedExceptione){}flagtrue;// 修改可能不会立即对其他线程可见});ThreadreadernewThread(()-{while(!flag){// 可能永远循环看不到flag的变化}});writer.start();reader.start();}}2. 竞态条件像抢购限量商品竞态条件就像多人同时抢购最后一件商品A看到有库存B也看到有库存但只有一人能成功购买。publicclassRaceCondition{privateintbalance100;// 不安全的取款方法publicvoidwithdraw(intamount){if(balanceamount){// 如果在这里线程被切换可能导致超额取款balance-amount;}}}三、Java中的线程安全解决方案1. 内置锁(synchronized)厨房的专用令牌synchronized关键字就像厨房的专用令牌只有拿到令牌的厨师才能使用特定厨具。publicclassSafeCounter{privateintcount0;publicsynchronizedvoidincrement(){count;// 现在安全了}}底层原理synchronized基于**监视器锁(Monitor)**实现每个Java对象都有一个内置锁。线程进入同步代码前自动获取锁退出时自动释放锁。2. volatile关键字餐厅的中央公告板volatile确保变量的修改立即对其他线程可见就像餐厅的中央公告板任何更新都会立即被所有人看到。publicclassVisibleFlag{privatevolatilebooleanstopRequestedfalse;publicvoidstop(){stopRequestedtrue;// 修改立即对所有线程可见}}但注意volatile不保证复合操作的原子性它只解决可见性问题。3. 原子类无锁的智能计数器Java的java.util.concurrent.atomic包提供了一系列原子类如AtomicInteger它们使用**CAS(Compare-And-Swap)**指令实现无需锁也能保证原子性。publicclassAtomicCounter{privateAtomicIntegercountnewAtomicInteger(0);publicvoidincrement(){count.incrementAndGet();// 原子操作性能比synchronized更高}}4. 并发集合线程安全的共享储物柜Java提供了多种线程安全的并发集合类ConcurrentHashMap支持高并发的HashMap实现CopyOnWriteArrayList读多写少场景的理想选择BlockingQueue优秀的生产者-消费者实现工具四、实战场景如何选择正确的线程安全策略场景1计数器高频更新// 推荐AtomicLong性能最佳privateAtomicLongrequestCountnewAtomicLong();// 次选synchronized保证安全但性能较低privatelongrequestCount0;publicsynchronizedvoidincrement(){requestCount;}场景2缓存读多写少// 推荐ConcurrentHashMap并发读写性能均衡privateConcurrentHashMapString,ObjectcachenewConcurrentHashMap();// 特殊情况CopyOnWriteArrayList读极多写极少privateCopyOnWriteArrayListStringconfigListnewCopyOnWriteArrayList();场景3状态标志简单状态控制// 推荐volatile简单可见性保证privatevolatilebooleanshutdownRequestedfalse;// 不推荐AtomicBoolean过度复杂volatile已足够五、线程安全的级别从不可变到线程对立根据线程安全程度我们可以将类分为几个级别不可变(Immutable)像String、Long这样的类状态创建后就不能改变天生线程安全。无条件的线程安全如ConcurrentHashMap有足够的内部同步无需外部同步。有条件的线程安全如Collections.synchronizedList返回的集合迭代时需要外部同步。非线程安全如ArrayList、HashMap需要客户端自己实现同步。线程对立即使外部同步也无法保证线程安全应避免。六、线程安全的最佳实践优先使用不可变对象不可变对象天生线程安全是解决并发问题的最佳选择。文档化线程安全保证在代码文档中明确说明类的线程安全级别。避免过度同步同步范围过大可能导致性能问题甚至死锁。谨慎使用公共锁对象考虑使用私有锁对象防止拒绝服务攻击。publicclassPrivateLock{privatefinalObjectlocknewObject();// 私有锁对象publicvoidsafeMethod(){synchronized(lock){// 外部无法干扰// 安全操作}}}七、总结线程安全的终极秘诀线程安全不是魔法而是建立在三个基石上原子性操作要么完全执行要么完全不执行可见性一个线程的修改对其他线程立即可见有序性程序按代码顺序执行允许必要的重排序优化回到餐厅厨房的比喻确保线程安全就像制定良好的厨房工作规则为关键区域设立专用令牌(synchronized)设置中央公告板及时通知变化(volatile)以及建立明确的工作流程(原子操作)。最重要的是在编写并发代码时不要依赖猜测而要基于可靠的并发工具和明确的约定。多线程编程虽然复杂但掌握了正确的方法和工具我们就能编写出既安全又高效的程序。参考文章https://www.51cto.com/article/627460.htmlhttps://blog.csdn.net/u013773608/article/details/99752973https://blog.csdn.net/Coloured_Glaze/article/details/100635585https://blog.csdn.net/weixin_33893473/article/details/92415650https://blog.csdn.net/2301_78064339/article/details/131021135https://my.oschina.net/emacs_8710921/blog/17077058https://my.oschina.net/emacs_9455642/blog/18592766[深入讲解线程安全在值对象模式中的不可变性](https://blog.csdn.net/zhxup606/article/details/151683489更多技术干货欢迎关注微信公众号科威舟的AI笔记~【转载须知】转载请注明原文出处及作者信息
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

iis如何做网站广告设计公司工作规范流程

Windows系统快速部署pgvector:PostgreSQL向量搜索完整指南 【免费下载链接】pgvector Open-source vector similarity search for Postgres 项目地址: https://gitcode.com/GitHub_Trending/pg/pgvector PostgreSQL的pgvector扩展为数据库注入了强大的向量相…

张小明 2025/12/29 6:18:50 网站建设

wordpress 下载网站模板网络广告营销案例分析

第一章:Open-AutoGLM 电影票预订选座操作 Open-AutoGLM 是一个基于大语言模型的自动化操作框架,支持在复杂 Web 界面中模拟用户行为,实现如电影票预订与选座等任务。通过自然语言指令驱动,系统可解析页面结构并执行精准点击、选择…

张小明 2025/12/29 6:18:48 网站建设

网站名称需要用注册吗做网站客户总是要退款

在短视频、广告片、影视游戏创作或自媒体变现中,音乐版权纠纷是创作者的核心痛点 —— 国内多数商用音乐需付费授权,预算有限或违规使用易面临下架、索赔风险。今天优先推荐国内头部合规平台「曲多多」,再补充 5 个海内外优质音乐素材网站&am…

张小明 2025/12/29 6:18:45 网站建设

厦门网站建设厦门网站开发毕设

第一章:为什么你的检索结果不精准?Dify相关性评估避坑指南在构建基于检索增强生成(RAG)的应用时,检索结果的相关性直接决定了最终输出的质量。许多开发者在使用 Dify 平台时发现,尽管文档已成功索引&#x…

张小明 2025/12/29 6:18:43 网站建设

学做网站卖东西去哪学做兼职的网站有哪些工作内容

iOS动画组件深度实战:Lottie-ios交互动效开发全攻略 【免费下载链接】lottie-ios airbnb/lottie-ios: Lottie-ios 是一个用于 iOS 平台的动画库,可以将 Adobe After Effects 动画导出成 iOS 应用程序,具有高性能,易用性和扩展性强…

张小明 2025/12/29 6:18:40 网站建设

吉林省高等级公路建设局 网站可以做动漫的网站

这是一个小红书上Java程序员失业的真实经历分享截图 说真的,这两年看着身边一个个搞Java、C、前端、数据、架构的开始卷大模型,挺唏嘘的。大家最开始都是写接口、搞Spring Boot、连数据库、配Redis,稳稳当当过日子。 结果GPT、DeepSeek火了…

张小明 2025/12/29 6:18:38 网站建设