进程通信的方式——线程的生命周期——mybatis #和$的区别是什么

进程通信方式与线程生命周期详解:从管道到数据库
本文详细介绍了进程通信的多种方式,如匿名管道、命名管道、信号、消息队列、共享内存+信号量、内存映射和Socket,以及线程的生命周期五个阶段。此外,还探讨了线程阻塞状态下的解除机制。同时提到了MyBatis中#和$的区别,以及预编译SQL的重要性。

1.进程通信的方式有哪些

  • 匿名管道

    无名管道只能用于具有亲缘关系的进程间的通信。

  • 命名管道

    不相关的进程也能交换数据

  • 信号

    事件发生时对进程的通知机制,有时也称之为软件中断

  • 消息队列

    信号可以导致一个正在运行的进程被另一个正在运行的异步进程中断,转而处理某一个突发事件。

  • 共享内存+信号量

    信号量: P 操作和 V 操作

  • 内存映射

    是将磁盘文件的数据映射到内存,用户通过修改内存就能修改磁盘文件

  • Socket

    Socket 一般用于网络中不同主机上的进程之间的通信

2.线程的生命周期

  • 一个线程的生命周期,共包括五种状态,分别是新建、就绪、运行、阻塞、死亡。
  1. ​ 当线程被创建后,它默认处于新建状态。这时它就是一个普通的Java对象,并不会表现出任何线程的特征,线程体也不会被执行。此时,JVM会为线程对象分配内存,并初始化其成员变量的值。
  2. ​ 当调用线程对象的start()方法后,该线程处于就绪状态。这时线程也没有开始运行,这个状态只表示线程是可以运行的,至于线程何时运行,取决于JVM里线程调度器的调度。此时,JVM会为线程创建调用栈和程序计数器。
  3. ​ 如果线程获得了CPU开始执行线程体,则线程处于运行状态。对于单处理器的计算机,同一时刻只有一个线程处于运行状态。对于多处理器的计算机,将会有多个线程并行执行。
  4. ​ 线程开始运行后,不会一直处于运行状态,它会因为CPU的轮换而产生中断。具体来说,当发生如下情况时,线程会进入阻塞状态:调用sleep()、调用阻塞式IO方法、未抢到锁被阻塞、等待某个通知、被suspend()挂起。
  5. ​ 最后,线程会以如下三种方式结束,结束之后便进入死亡状态:线程体执行完毕、线程抛出异常、直接调用stop()方法来结束线程。
**加分回答** 

当线程处于阻塞状态时,会通过如下情形解除阻塞,使其重新回到就绪状态: 
  • 调用的sleep()方法时间到了。
  • 调用的阻塞式IO方法已经返回。
  • 成功地抢到了锁。
  • 其他线程发出了通知。
  • 挂起的线程被resume()方法恢复。

3.mybatis #和$的区别是什么

#{}解析成预编译语句 预编译之后直接执行,不需要重新编译sql.

${}仅作为一个字符串替换 执行前进行编译 存在sql注入

PrepareStatement和Statement

mybatis 底层使用了preparedstatement和占位符 默认情况下对所以sql进行预编译

select * from `user` where `id` = ?;

所谓的预编译,当我们把上面的那句SQL传给MySQL服务器的时候,服务器就已经帮我们编译了,编译成了一个SQL模板(可以类比函数),同时占位符?成了参数,当我们使用setInt()、setString()插入数据时,实际上只是往SQL模板里面传入参数,这个过程编译与执行是分开的,模板被放入了模板池,当需要时取出插入数据即可,不需要继续编译。

StatementPrepareStatement的区别在于,前者属于编译并执行,后者属于先编译后执行,前者给sql服务器传递了完整的sql语句,sql服务器就需要给整条语句进行编译,这时候如果进行了sql注入,sql服务器编织出得结果就会与我们的预期产生误差。

预编译的作用:
  1. 预编译对象可以重复利用,下一次同一个sql,可以直接使用这个PrepareStatement对象。数据库服务器不需要再次编译 可以提供性能
  2. 防止sql注入 注入的参数不会认为它是一个sql,而是一个参数
<think>嗯,用户想要一份关于Java求职者所需技术技能的总结,覆盖Java基础、开源框架、数据库Linux开发这几个方面。之前对话里用户提到过参考站内引用,不过那些引用内容比较泛,主要还是些专栏介绍零散的面试片段。 用户可能正在准备Java开发岗位的面试,或者想系统性地提升自己的技术栈。从引用[2][3]能看出,大厂对Java程序员的要求确实不低,尤其是对JVM原理、高并发处理、框架底层这些深度知识的要求。引用[3]里提到的"亿级数据导出方案""索引优化""线程池参数"这些具体问题,其实暗示了用户需要掌握解决实际生产问题的能力。 我上次给的总结结构用户应该比较满意,这次可以延续类似的分类方式,但要把Linux开发单独列出来。特别要注意引用[3]里反复出现的性能优化问题——比如JVM内存溢出解决亿级数据处理,这些必须作为重点呈现。 Java基础部分还是要强调三大核心:集合、并发IO/NIO。引用[2]明确说了"对并发的理解,对内存使用的理解"是基本功,这块得展开讲。框架方面,Spring全家桶的底层机制必须提,尤其是IoC/AOP这种高频考点。数据库部分用户上次没细问,这次可以补充索引优化事务隔离级别的实战经验。 Linux开发那块虽然引用里没直接说,但几乎所有Java服务都部署在Linux上,Shell脚本编写线上问题排查工具(如jstat/arthas)肯定要包含。用户可能忽略了运维能力的重要性,这点得提醒。 最后加相关问题时要扣住用户可能的进阶需求——比如分布式架构性能优化,毕竟大厂面试终归会问到这些。要不要提云原生呢?看引用[1]里有"大数据""AI"相关专栏,可能用户对新技术趋势也有兴趣,放在最后一个问题里比较稳妥。 </think>以下是针对Java技术岗位求职者所需核心技能的总结,结合主流企业招聘要求技术发展趋势整理而成: --- ### **一、Java基础技术** [^2][^3] 1. **语言核心** - 深入理解面向对象编程(OOP):封装、继承、多态、抽象 - 集合框架:`ArrayList`/`LinkedList`差异、`HashMap`底层原理(红黑树扩容机制)、并发集合(`ConcurrentHashMap`) - 并发编程:线程生命周期、`synchronized`锁优化、`volatile`原理、`ThreadLocal`应用与内存泄漏风险 - JVM内存模型:堆/栈结构、GC算法(G1/ZGC)、OOM故障排查(MAT分析堆转储) - IO/NIO:BIO阻塞模型、NIO多路复用机制(`Selector`)、零拷贝实现 2. **新特性与性能优化** - Java 8+特性:Lambda表达式、Stream API、CompletableFuture异步编程 - JVM调优:GC日志分析、堆参数配置(`-Xms`/`-Xmx`)、JIT编译原理 - 代码效率:避免反射滥用、减少上下文切换、对象池技术应用 --- ### **二、开源框架** [^2][^3] 1. **Spring生态** - **IoC容器**:Bean生命周期、循环依赖解决(三级缓存)、注解驱动开发 - **AOP**:动态代理(JDK/CGLIB)、切面织入原理、事务管理(`@Transactional`传播机制) - **Spring MVC**:请求处理流程(`DispatcherServlet`)、参数解析器(`HandlerMethodArgumentResolver`) - **Spring Boot**:自动配置原理(`spring.factories`)、Starter自定义开发、Actuator监控 - **Spring Cloud**:服务注册(Eureka/Nacos)、熔断(Hystrix/Sentinel)、网关(Gateway) 2. **ORM框架** - MyBatis:一级/二级缓存机制、动态SQL优化、分页插件原理 - JPA:懒加载问题、N+1查询解决方案、审计功能(`@CreatedDate`) 3. **中间件集成** - 消息队列:Kafka副本同步机制、RocketMQ事务消息 - 分布式缓存:Redis持久化策略(RDB/AOF)、缓存击穿/雪崩解决方案 --- ### **三、数据库能力** [^1][^3] 1. **SQL与调优** - 索引原理:B+树结构、覆盖索引、最左前缀原则 - 执行计划解读:`EXPLAIN`输出分析(type/rows/key字段) - 慢查询优化:分库分表策略(ShardingSphere)、读写分离方案 2. **事务机制** - ACID实现原理、隔离级别(幻读/不可重复读)、MVCC机制 - 分布式事务:Seata的AT模式、TCC补偿事务 3. **NoSQL实践** - MongoDB聚合管道、Elasticsearch倒排索引与分词器 - 缓存数据库:Redis的Zset实现延迟队列、布隆过滤器应用 --- ### **四、Linux开发技能** [^3] 1. **系统操作** - Shell脚本编写:自动化部署(CI/CD)、日志分析(`awk/sed`) - 进程管理:`ps`/`top`监控、信号量通信(`kill -9`)、守护进程配置 2. **线上问题排查** - 内存泄漏:`jmap`生成堆转储、`jstack`定位线程死锁 - CPU飙高:`arthas`的`thread -n`命令分析热点代码 - 网络诊断:`tcpdump`抓包、`netstat`查看连接状态 3. **容器化部署** - Docker:镜像分层构建、网络模式(bridge/host) - Kubernetes:Pod调度策略、Service流量负载、Helm包管理 --- ### **五、补充能力** 1. **分布式系统**:CAP理论实践、ZooKeeper选举算法、分布式ID生成方案 2. **设计模式**:工厂模式(Spring BeanFactory)、责任链(FilterChain)、观察者(ApplicationEvent) 3. **工具链**:Git分支管理策略、Jenkins Pipeline语法、Prometheus监控指标配置 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值