
Java
文章平均质量分 85
冲上云霄的Jayden
这个作者很懒,什么都没留下…
展开
-
Java面向对象中里式替换原则(Liskov Substitution Principle,LSP)、 开闭原则(OCP)、接口隔离原则(ISP)和依赖倒置原则(DIP)
举个例子说明Java面向对象中里式替换原则(Liskov Substitution Principle,LSP)、 开闭原则(OCP)、接口隔离原则(ISP)和依赖倒置原则(DIP)原创 2024-09-26 10:54:32 · 424 阅读 · 0 评论 -
Ubuntu 22.04同时安装OpenJDK 8和21版本
Ubuntu 22.04上同时安装OpenJDK 8和21版本,切换、设置默认版本原创 2024-08-01 15:04:59 · 897 阅读 · 0 评论 -
为什么RPC要比Http高效?
HTTP和TCP分别属于不同的网络层次,服务于不同的目的。HTTP是一个应用层协议,用于传输网页数据和资源;TCP是一个传输层协议,提供可靠的数据传输服务。HTTP在实际应用中依赖于TCP协议来实现数据的可靠传输。理解两者的区别和联系,有助于更好地设计和优化网络应用。OSI(Open Systems Interconnection)模型是由国际标准化组织(ISO)提出的网络通信模型,用于定义网络通信的框架。OSI模型将网络通信过程分为七个层次,每一层都具有特定的功能和职责。原创 2024-06-06 18:10:17 · 2145 阅读 · 1 评论 -
Java获取文件类型,FileTypeUtil、Files、MimetypesFileTypeMap、URL多种实现对比
优先使用JDK URL的检测方式,再使用JDK Files方式,优点是无需引入额外的依赖包,也能保证正确性。工作中需要判断文件是否是音频文件,实际生产环境中,遇到用户修改文件后缀的情况,导致逻辑处理异常。原创 2024-04-29 18:33:17 · 1005 阅读 · 2 评论 -
Java CPU使用率高排除方法
通过ps指令看到pid=1799程序CPU使用率47.1%,再看看程序的线程使用情况。Options,选项,我们一般使用 -gcutil 查看gc情况。top -p PID:观察该PID对应进程的占用情况。排序列出“29116”cpu使用率高的前10名线程。vmid,VM的进程号,即当前运行的java进程号。” 开启线程显示,观察CPU占用较高的线程。count,打印次数,如果缺省则打印无数次。interval,间隔时间,单位为毫秒。每5秒打印一次GC情况,打印10次。将需要的线程ID转换为16进制格式。原创 2023-12-11 20:02:07 · 234 阅读 · 0 评论 -
Java 22种设计模式详解
设计模式通常分为三类:创建型(Creational),结构型(Structural)和行为型(Behavioral)。设计模式可以看作是程序设计的经验总结,它们可以提高代码的可维护性、可扩展性、和复用性。在实际的软件开发中,设计模式经常会被结合起来使用,来解决复杂的设计问题。这类模式专注于如何创建对象或类的实例。单例模式的目的是确保一个类只有一个实例,并提供一个全局访问点。下面是一个线程安全的单例模式实现,采用“双重检查锁定”(Double-Checked Locking)方案。这种方案在多线程环境下可以保原创 2023-12-06 14:36:25 · 1904 阅读 · 0 评论 -
JVM-多线程&并发-synchronized底层实现、偏向锁、轻量级锁、重量级锁介绍
介绍synchronized底层实现、锁升级过程,锁的介绍以及相关的问题原创 2022-02-26 17:43:29 · 159 阅读 · 0 评论 -
Java 死锁的原理、检测和解决死锁
介绍死锁的原理、死锁产生的条件、死锁的例子和解决死锁原创 2023-04-20 17:40:40 · 1261 阅读 · 0 评论 -
Java-多线程&并发-线程的实现、调度和状态转换
而操作系统提供支持的轻量级进程则作为用户线程和内核线程之间的桥梁,这样可以使用内核提供的线程调度功能及处理器映射,并且用户线程的系统调用要通过轻量级线程来完成,大大降低了整个进程被完全阻塞的风险。因此,在目前的JDK版本中,操作系统支持怎样的线程模型,在很大程度上决定了Java虚拟机的线程是怎样映射的,这点在不同的平台上没有办法达成一致,虚拟机规范中也并未限定Java线程需要使用哪种线程模型来实现。线程除了依赖内核线程实现和完全由用户程序自己实现之外,还有一种将内核线程与用户线程一起使用的实现方式。原创 2023-02-20 17:39:36 · 628 阅读 · 0 评论 -
Java-性能分析&监控工具
MBean浏览器中查看类属性信息:内存栏目查看GC、各个内存区域使用情况:线程状态、死锁、堆栈信息:可以看到线程列表、线程状态、线程名称、线程堆栈等信息。原创 2023-01-08 21:51:19 · 3870 阅读 · 4 评论 -
JVM-逃逸分析浅析
逃逸分析定义:一种确定指针动态范围的静态分析,它可以分析在程序的哪些地方可以访问到指针。逃逸分析并不是直接的优化手段,而是一个代码分析,通过动态分析对象的作用域,为其它优化手段如栈上分配标量替换和同步消除方法逃逸和线程逃逸。方法逃逸:当一个对象在方法中定义之后,作为参数传递到其它方法中;方法逃逸://User要实现get,set方法,还要实现toString方法 return user . toString();线程逃逸:如类变量或实例变量,可能被其它线程访问到;原创 2023-01-05 21:08:38 · 709 阅读 · 1 评论 -
JVM-JIT
JIT编译,全称 just-in-time compilation,也就是即时编译。通过JIT技术,能够做到Java程序执行速度的加速。那么,是怎么做到的呢?Java是一门解释型语言(或者说是半编译,半解释型语言)。Java通过编译器javac先将源程序编译成与平台无关的Java字节码文件(.class),再由JVM解释执行字节码文件,从而做到平台无关。但是,有利必有弊。对字节码的解释执行过程实质为:JVM先将字节码翻译为对应的机器指令,然后执行机器指令。原创 2023-01-04 20:32:38 · 605 阅读 · 0 评论 -
Java-多线程&并发-线程池实现、使用、源码
池化技术想必大家已经屡见不鲜了,线程池、数据库连接池、Http 连接池等等都是对这个思想的应用。池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率。 《Java 并发编程的艺术》提到的使用线程池的好处:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。原创 2022-02-26 17:41:14 · 355 阅读 · 0 评论 -
Java-ArrayList 源码、缩容、扩容机制分析
ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增长。在添加大量元素前,应用程序可以使用ensureCapacity操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。ArrayList继承于 AbstractList ,实现了 List, RandomAccess, Cloneable, java.io.Serializable 这些接口。是一个标志接口,表明实现这个这个接口的 List 集合是支持快速随机访问的。原创 2022-02-26 17:41:00 · 614 阅读 · 0 评论 -
Java-HashMap源码
简介 HashMap 主要用来存放键值对,它基于哈希表的 Map 接口实现,是常用的 Java 集合之一,是非线程安全的。 HashMap 可以存储 null 的 key 和 value,但 null 作为键只能有一个,null 作为值可以有多个。 JDK1.8 之前 HashMap 由 数组+链表 组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突)。 JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(原创 2022-02-26 17:40:40 · 747 阅读 · 0 评论 -
Java-ConcurrentHashMap
第一次添加元素的时候,默认初期长度为16,当往map中继续添加元素的时候,通过hash值跟数组长度取与来决定放在数组的哪个位置,如果出现放在同一个位置的时候,优先以链表的形式存放,在同一个位置的个数又达到了8个以上,如果数组的长度还小于64的时候,则会扩容数组。通过扩容数组的方式来把这些节点给分散开。接下来遍历链表的后续节点,没添加一个元素的时候,都会通过判断hash值来决定是放在根节点的左节点还是有节点,如果左/右节点不为空,则继续以左/右节点来重复判断,直到左/右节点为空,则添加到左/右位置。原创 2022-02-26 17:40:24 · 843 阅读 · 0 评论 -
Java-多线程&并发-ThreadLocal
概述 多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线程安全性。ThreadLocal是除了加锁这种同步方式之外的一种保证一种规避多线程访问出现线程不安全的方法,当我们在创建一个变量后,如果每个线程对其进行访问的时候访问的都是线程自己的变量这样就不会存在线程不安全问题。 通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。而使用ThreadLocal创建的变量只能被当前线程原创 2022-02-26 17:40:02 · 681 阅读 · 0 评论