JUC 核心前置:Java 内存模型与多线程核心八股

JUC 核心前置:Java 内存模型与多线程核心八股

1. 介绍Java的内存模型(JMM)

JMM是多线程并发问题的一套规则,也就是在规定是多线程的环境下,线程怎们访问变量才会步出错这里要处理可见性、原子性、有序性

可见性:若线程A从CPU共享变量里拿到变量到自己的工作内存里修改变量后还没来得及把变量放回共享变量里,那么线程B在此时就看不到变量的更新,此时就要用volatitle关键字来约束、让整个流程结束后才能让其他线程访问这个变量

原子性:若线程AB同时执行i++这个操作,首先i++是先读i再加1再放回原本变量,当线程A已经把i=10更新为i =11了,可能线程B才把i更新为11这样结果就会出错,所以就需要synchronized 或lock锁来让只有一个线程结束后另一个线程才能操作,且中间不会被打断,提供了互斥访问

有序性:就是可能代码执行顺序有问题,在单线程时,我们常常初始化一个对象A,再把这个对象的引用给变量a。可在多线程时,为了编译速度,编译器或者cpu可能会改变你的代码执行顺序,可能会优先给变量a赋值A的引用,但A还没初始化好时,线程B就访问a,由于A还没有初始化完全就会报错,synchronized或者lock锁就会构建一个锁屏障来防止这个重排序的发生,保证正确

所以JMM的核心思路就是:定义主内存(共享变量)和工作内存,只有把变量从主内存拿到工作内存才能修改变量,修改后再放回主内存

然后再通过synchronized和volatile关键字、lock锁这样的方式,来控制加载时机、写回时机、不合理的重排序保证多线成共享变量时的正确交互

2.Java多线程是什么?需要注意什么

Java多线程是值在同一个Java程序里运行多个线程、这些线程共享变量、方法区等资源,比如一个线程输入、一个线程后台下载文件、就可以提提高程序运行的效率

1.线程之间的通信:要避免一个线程还没有准备好,另一个线程就来访问这个线程的变量,可以用wait()或notify()方法来控制访问的时机

2.线程数据安全问题:比如两个线程同时加1,那么变量应该加2,可能结果只加了1,就需要用synchronizes、volatitle关键字来,控制线程执行的时机,保证数据安全

3.线程的创建和销毁:线程频繁的创建和销毁很浪费系统资源、可以在线程池里提前准备多个线程以应用,减少资源的消耗

3.Java的线程和操作系统的线程一样吗

Java的线程底层是pthread_create创建的,和操作系统的是一样的、都是一对一的线程模式

再说一下Java多线程的注意点:可见性、原子性、有序性

4.保证数据一致性的方法有哪些?

事务管理、锁机制、版本控制

事务管理:来保证一组数据库操作要么全部成功,要么就全部失败回滚,通过ACID(原子性、隔离性、持久性、一致性)属性,数据库数据可以保证一致性

锁机制:通过锁机制来保证对共享资源的互斥访问,在java中可以利用synchronized和其他锁机制来控制并发访问,从而导致并发操作导致数据不一致

版本控制:通过乐观锁机制实现并发修改时的冲突检测,允许基于最新版本号的修改生效,否则拒绝覆盖并要求重试或解决冲突,从而避免旧版本修改覆盖新版本数据,保证并发场景下的数据一致性

Read more

深入探究 Linux 设备树

深入探究 Linux 设备树

引言 在上一篇文章《深入探究 Linux 总线-设备-驱动模型》中,我分别介绍了总线、设备和驱动这三个部分,并对相应的内核源码进行了分析,还描述了他们之间的协同工作关系,说白了,其实这三个部分是互成掎角之势的。 如下图,左边是驱动,就是我们自己写的逻辑代码,告诉内核操作这个设备的方法。 右边是设备,它是用来描述硬件资源的一种数据结构,负责告诉内核这是哪种类型的设备,地址在哪,中断号是多少,但有一点要注意,这里的设备指的并不是我们日常生活中的使用的硬件设备,而是内核中的 struct device 结构体。 中间是总线,用来匹配驱动和设备的,这里的匹配过程是有优先级的(上一篇文章的1.2节讲过),但这并不是现在的重点,只需要知道总线通过比较二者一个特殊的字符串是否相同来决定他们能否匹配成功,这个特殊的字符串到底是什么取决于优先级。 驱动代码是咱们自己写的,咱们当然熟了,但是那个跟驱动配对的 struct device,如果只是单纯的去写一个驱动,而不深入底层去探究原理,其实你会发现对这个结构体并没有什么印象,那么问题就来了,它到底是怎么进入内核并与驱动进行配对的呢? 如果在用

By Ne0inhk
我把OpenClaw调教成了能替我干活的AI员工,以后上班可以摸鱼了!

我把OpenClaw调教成了能替我干活的AI员工,以后上班可以摸鱼了!

手把手教你一键部署OpenClaw(Clawdbot),2分钟搞定! 网上教你装OpenClaw(小龙虾)的文章满大街都是,但装好后怎么让它真正派上用场,几乎没人讲透。 这半个月我为了折腾搜索、浏览器、文件同步和人格配置,前前后后烧掉不少钱,最后理出了这份实战清单。 文章挺长,建议把配置方法直接丢给你家的AI,让它手把手带你弄。 动手之前,咱们先得换个思路:别把小龙虾当成ChatGPT那种助手,把它想成你刚招的一个远程员工。 既然是员工,你就得给人家配电脑、开网络、装工具,还得讲清楚你是谁、你平时干活的习惯是什么。 下面分享的,就是我给这位“远程同事”搭工位的全过程。 手把手教你一键部署OpenClaw(Clawdbot),2分钟搞定! 一、 准备工作:电脑、大脑、部署 1、 搞台云服务器 首先,小龙虾得有个安身立命的电脑。 虽然很多人喜欢部署在Mac mini或者闲置本子上,但我更建议买云服务器。 服务器24小时不关机,你随时随地都能用,不像家里的电脑关了就断了。 这里有两个坑得避开: 第一,

By Ne0inhk
Python+AI 实战:搭建属于你的智能问答机器人

Python+AI 实战:搭建属于你的智能问答机器人

欢迎文末添加好友交流,共同进步! “ 俺はモンキー・D・ルフィ。海贼王になる男だ!” 引言 * 在数字化转型浪潮中,智能问答机器人正成为企业客服、知识库检索乃至个人助理等场景的关键交互入口。它能让员工秒级获取技术解答、客户即时获得业务支持、学习者随时得到个性化辅导,极大提升信息获取效率与用户体验。 * 为何选择 Python 与开源 AI 模型?Python 拥有成熟的 AI 生态——Hugging Face Transformers、LangChain、FAISS 等工具大幅降低开发门槛;而本地部署的开源大模型(如 Phi-3、Mistral、Llama 系列)则保障了数据隐私、规避了 API 成本,特别适合对安全性或离线能力有要求的场景。 * 本文将手把手带你从零构建一个基于 RAG(检索增强生成)架构的本地智能问答系统:使用 Sentence-BERT 实现语义检索,FAISS 作为向量数据库,并集成轻量级开源语言模型生成答案。

By Ne0inhk

Flutter 三方库 bip39 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、稳健的工业级助记词生成与确定性分层秘钥引擎

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 bip39 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、稳健的工业级助记词生成与确定性分层秘钥引擎 在鸿蒙(OpenHarmony)系统的加密钱包、隐私文件保护或去中心化身份(DID)应用中,如何构建一套符合国际标准的、易于离线备份且可恢复的秘钥体系?bip39 为开发者提供了一套完整的助记词(Mnemonic Code)生成与种子(Seed)推导方案。本文将深入实战其在鸿蒙安全域内的应用。 前言 什么是 BIP39?它是比特币改进建议(Bitcoin Improvement Proposal)中的第 39 号提案。它的核心思想是将原本难以记忆的二进制秘钥转化为 12 或 24 个常见单词。在 Flutter for OpenHarmony 的实际开发中,利用该库,我们可以让鸿蒙用户通过备份一组“

By Ne0inhk