浅谈 equals() 和 hashCode() equals() 和 ==== 可以用来判断基本数据类型和引用数据类型: 对于基本数据类型来说,== 比较的是值。 对于引用数据类型来说,== 比较的是对象的内存地址。 equals() 只能用来判断两个对象是否相等。 equals() 方法存在于 Object 类中,所以所有类都有 equals() 方法。 Object 类中 equals() 方法的实现: 123public boole 2024-12-05 Java > Java基础
ArrayList 底层实现 底层使用 Object[] 数组存储元素。 当调用无参构造函数时,ArrayList 会被初始化为一个空的 Object[],容量为 0。只有在添加第一个元素时,容量才会扩展到默认值 10。 当调用带参构造函数时: 如果传入的参数为 0,则 ArrayList 同样会初始化为一个空的 Object[],容量为 0; 如果传入的参数大于 0,则会直接将 Object[] 的大小初始化为传入 2024-12-03 Java > Java集合
Java代理模式 代理模式也属于一种设计模式,简单来说就是我们实现一个代理对象,使其代替对真实对象的访问,这样就能够在不修改原对象的基础上来提供额外操作。代理对象的主要作用就是扩展目标对象的功能,比如在目标方法的执行前后添加一些自定义的操作。代理模式有 静态代理 和 动态代理 两种实现方式。 静态代理静态代理的几个特点: - 一对一。每个目标类都要单独写一个代理类。 - 纯手动。对每个方法的增强都是手动完成的,一旦 2024-11-25 Java > Java基础
CAS 乐观锁和悲观锁 乐观锁多用于“读多写少“的环境,避免频繁加锁影响性能; 悲观锁多用于”写多读少“的环境,避免频繁失败和重试影响性能 什么是 CAS V:要更新的变量(var) (可以理解成旧值实际是多少) E:预期值(expected) (可以理解成旧值应该是多少) N:新值(new) 比较并交换的过程如下: 判断 V 的值是否等于 E,如果等于,将 V 的值设置为 N;如果不等,说明已经有其 2024-11-20 Java > Java并发编程
synchronized synchronized 是 Java 中的一个关键字,主要解决的是多个线程之间访问资源的同步性,可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。 早期 Java 中 syncronized 属于重量级锁,这是因为 syncronized 依赖于监视器锁,而监视器锁由依赖于底层操作系统的 Mutex Lock。操作系统实现线程之间的切换需要由用户态转换为内核态,这个状态需要较长时间, 2024-11-20 Java > Java并发编程
并发编程中涉及到哪些锁 为了减少获得锁和释放锁带来的性能消耗,JDK 1.6 引入了偏向锁 和 轻量级锁 的概念,对 synchronized 做了一次重大的升级,升级后的synchronized性能可以说上了一个新台阶。 在 JDK 1.6 及其以后,一个对象其实有四种锁状态,它们级别由低到高依次是: 无锁状态 偏向锁状态 轻量级锁状态 重量级锁状态 锁的存放位置每一个 Java 对象都有一个对象头,64 位 J 2024-11-20 Java > Java并发编程
浅析 synchronized 锁升级流程 在 JDK 1.5 版本(包含)之前,锁的状态只有两种:“无锁状态”和“重量级锁状态”。只要有线程访问共享资源对象,锁就直接成为重量级锁。从 JDK 1.6 版本开始,JVM 对 synchronized 锁进行了优化,引入了“偏向锁”和“轻量级锁”,以减少上下文切换并提高性能。因此,锁的状态变为四种: 无锁(No Lock) 当共享资源没有多线程竞争访问时,不需要加锁,也就是无锁状态。 偏 2024-11-20 Java > Java并发编程
JMM Java 内存模型(Java Memory Model,JMM)定义了 Java 程序中的变量、线程如何和主存以及工作内存进行交互的规则,主要涉及到多线程环境下的共享变量可见性、指令重排等问题。Java通过共享内存并发模型来解决不同线程之间的通信和同步问题。Java 线程之间的通信由 Java 内存模型(简称 JMM)控制。 共享变量 由图可见,如果线程A想要和线程B进行通信,则要经过以下两个步骤 2024-11-20 Java > Java并发编程
并发编程中的一些基础知识 进程和线程进程进程是程序运行的基本单位。系统运行一个程序即是一个进程从创建,运行到消亡的过程。 在 Java 中,我们启动 main 函数时其实就是启动了一个 JVM 的线程,而 main 函数所在的线程就是这个进程中的一个线程,也称主线程。 线程线程是比进程更小的程序执行单位,一个进程在其执行过程中可以产生多个线程。 同一个进程中的多个线程共享一个 堆 和 方法区,但每个线程有自己 独立 的 程 2024-11-20 Java > Java并发编程
ConcurrentHashMap JDK 1.8 之前 基本信息底层通过 Segment 段 + 数组 + 链表实现。 线程安全通过对 Segment 加锁实现。 Segment 的数量在初始化时确定,无法动态改变,因此 Segment 的个数决定了 最高并发线程数(默认最多支持 16 个线程并发,具体取决于初始化时的配置)。 初始化 判断 ConcurrencyLevel 是否大于最大值,若大于则将其重置为最大值 65535,无 2024-11-20 Java > Java集合