java常识2

简介: 本内容介绍了并发编程中的核心概念与实现机制,包括悲观锁与乐观锁的原理及应用、Java中的synchronized与ReentrantLock的区别、线程池的参数配置、线程创建方式、Lambda表达式的特性、反射机制及其应用场景。内容涵盖了数据库锁、第三方中间件锁、JUC并发包中的常用工具类,以及BIO、NIO、AIO的基本原理和使用场景,适合对Java并发编程有深入学习需求的开发者参考。

悲观锁:互斥的

  • 数据库锁
  • update
  • 修改表字段
  • 追加索引
  • select ... for update
  • 读锁/写锁
  • 共享锁/排它锁
  • java锁
  • synchronzed
  • reetrantlock
  • 第三方中间件
  • redis:setnx ex
  • redisson
  • zookeeper
  • etcd3

乐观锁:CAS思想(比较并交换)可能会引发ABA问题通过使用时间戳或者版本号解决

synchronized与lock和volatile

syn和reetranlock的区别

  • syn:
  • 锁在方法体上、同步代码块
  • JVM统一管理
  • 锁升级: 偏->轻量->重量
  • re
  • 代码块
  • 手动lock...unlock
  • 两者都是可重入锁

reetranlock 的实现原理

  • AQS(abstract queue sychronzed)
  • 底层有一个volitale修饰的变量
  • 0:无锁状态
  • 1:有锁状态
  • FIFO:first in first out
  • 加锁过程:变量state:0->1
  • 如果加锁的过程中,发现别人加锁了,就会进入自旋

JUC并发包

ComplateAbleFuture + CountDownLatch

Future接口

ReetrantLock

ConcurrentHashMap

CopyOnWriteArrayList(安全的arrarylist)

BIO NIO AIO

连接的四个阶段

服务器等待连接

客户端连接

服务器端准备数据,

服务器端传输数据到客户端

BIO(线程阻塞)

当客户端进行连接是,就会由线程进行处理(哪怕是数据在准备阶段,线程也是在进行阻塞)一连接一线程在高并发环境性能比较低

NIO(非阻塞io)

在高并发环境下主要采用多路复用技术,当有io请求时就会加入channel的双端,通过selcetor进行轮询查看数据状态,最后由由一个线程去统一处理io请求

AIO(异步io)

发出请求之后,不会进行阻塞,最终服务器端

threadlocal 多线程环境下

针对共享变量的每个线程都有一份,互不影响,线程对象内部有threadlocalmap,来存储线程隔离的资源,threadlocal作为key共享变量作为value,通过get和set方法进行设定保存,当不再使用是要用remove方法进行资源的清空,避免资源泄露

线程池七大参数

核心线程数 cpu密集型 ,io密集型

总线程数

存活时间(临时线程)

存活时间单位

工作队列

线程工厂

拒绝策略

线程创建的方式:

继承Thread,重写run方法,无返回值

实现Runable无返回值

实现Callable接口+future,有返回值

自定义线程池

lambda jdk8增加的特性

表达式本质

实现函数式借口

然后重写借口的唯一抽象方法

并返回实现类的实例化对象

与匿名内部类差不多,又称作箭头函数

但是匿名内部类可以实现其他借口和抽象类

匿名内部类作用与编译阶段

lambda作用与运行阶段

lambda的this作用域根据上下文,一般是包含lambda的外层类

匿名函数的this作用域是自身

反射

本质是jvm运行阶段动态获取class对象,反向加载类结构,操作类的成员

jvm在加载类时,会通过类加载器将.class文件解析成内存中的class对象,然后通过class对象访问存储在方法区的元数据

作用场景bean的注入junit的实现,mybatis的映射

效率方面:低于直接调用,因为反射要进行动态解析结构

相关文章
|
4月前
|
存储 JavaScript 前端开发
初始前端1
本文介绍了 Vue 组合式开发中使用 `ref` 实现响应式数据的方法,强调不依赖 `this`。内容包括创建 `.vue` 文件的模板结构、使用 `ref` 定义响应式变量(如 `count2.value`)与非响应式变量(如 `count3`)的区别,以及如何在模板中绑定数据。同时通过表格对比了 `ref` 在 JavaScript 和模板中的使用方式,指出在 JS 中需用 `.value` 操作数据,而在模板中可直接访问。最后以生活化的类比解释 `ref` 的作用,帮助开发者更好地理解响应式原理。
|
4月前
|
NoSQL Java 数据库
杂项8
缓存三剑客(穿透、击穿、雪崩)解析及解决方案:穿透指请求数据在Redis和数据库均不存在,可通过校验、空值缓存、布隆过滤器应对;击穿针对热点数据失效,可用互斥锁或永不过期策略;雪崩因大量缓存同时失效,可采用随机过期、集群部署、降级机制缓解。
|
4月前
|
消息中间件 存储 缓存
再次了解kafka
Kafka通过offset机制解决消息重复消费问题,支持手动提交偏移量及唯一ID去重。它保证分区内的消息顺序消费,结合集群、副本与重平衡实现高可用。高性能设计包括顺序读写、分区、页缓存、零拷贝等。数据清理依赖保留时间或大小策略,点对点和发布订阅模式则通过消费者组实现。
|
4月前
|
消息中间件 NoSQL Java
延时实现
本节介绍了多种关闭过期订单的实现方案,包括定时任务、JDK延迟队列、Redis过期监听、Redisson延迟队列、RocketMQ延迟消息及RabbitMQ死信队列。各自优缺点明显,适用于不同业务场景,如定时任务适合小数据量,RocketMQ适合高并发解耦场景,而Redisson则使用简单且高效。选择时需综合考虑系统复杂度、数据量及可靠性要求。
|
4月前
|
存储 缓存 Linux
CPU上下文切换的原理及其在系统调用和进程切换中的应用
本内容深入解析了CPU上下文切换的原理及其在系统调用和进程切换中的应用。详细说明了CPU寄存器、程序计数器在任务切换中的作用,以及系统调用与进程上下文切换的区别。同时探讨了上下文切换带来的性能开销,涉及TLB和虚拟内存管理机制,帮助理解操作系统如何高效调度进程。
|
4月前
|
消息中间件 存储 安全
初始kafka
Kafka因高吞吐量被广泛使用,适合处理大量用户行为数据,支持实时推荐和数据展示。其优势包括提升响应速度、故障隔离、低耦合、流量削峰等。但也有架构复杂、依赖Broker等缺点。为避免消息丢失,可通过同步/异步发送、重试机制、设置ACK确认级别、副本机制及手动提交offset等方式保障消息可靠性。
|
4月前
|
Java Nacos Sentinel
了解微服务
本文对比了微服务与单体架构的优缺点,指出单体架构适合小规模系统,开发部署简单,而微服务适合复杂系统,具备良好的扩展性和灵活性。同时介绍了Spring Cloud相关组件如Nacos、OpenFeign、Sentinel的原理与应用,以及微服务中的熔断、降级、限流机制和AT模式的工作原理。
|
4月前
|
存储 算法 Sentinel
熔断降级
本内容介绍了微服务中熔断降级的实现原理及Sentinel的底层机制。通过OpenFeign集成Sentinel,利用断路器统计异常和慢请求比例,触发熔断并降级,提升系统稳定性。还讲解了Sentinel使用的限流算法,如滑动窗口、令牌桶和漏桶算法,以应对不同场景下的流量控制需求。
|
4月前
|
Docker 容器
初始ollama
Ollama 按需加载模型,不持续运行,闲置时自动卸载,节省内存。模型响应请求时驻留内存,保留时间由 OLLAMA_KEEP_ALIVE 控制。类似 Docker 部署方式,但无单模型启停命令,默认时间内自动停止。可间接通过停止服务或配置多端口实现管理。
|
4月前
|
负载均衡 网络性能优化
了解EMQ
EMQ通过MQTT协议的QoS机制保障消息可靠传输,支持QoS 0、1、2三个等级,分别实现消息最多一次、至少一次和恰好一次传递。对于延迟消息,EMQ X支持通过特殊主题前缀`$delayed/{DelayInterval}`实现延迟发布。点对点通信可通过不带群组的共享订阅(如`$queue/t/1`)实现,结合负载均衡策略如随机、轮询等,确保消息仅由一个订阅者接收;发布订阅模式则通过带群组的共享订阅(如`$share/组名称/t/1`)实现,确保每组一个订阅者收取消息。