摘要: 在Java并发编程领域,final关键字扮演着一个至关重要的角色。虽然很多同学熟悉final用于修饰变量、方法和类的基本用法,但其在并发环境中的应用和原理却常常被忽视。final关键字不仅仅是一个简单的修饰符,它在多线程编程中确保对象状态的可见性和不变性,这对于构建线程安全的应用至关重要。本文将深入 阅读全文
posted @ 2024-10-08 18:23 程序员Seven 阅读(574) 评论(0) 推荐(5)
摘要: 介绍 volatile是轻量级的同步机制,volatile可以用来解决可见性和有序性问题,但不保证原子性。 volatile的作用: 保证了不同线程对共享变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。 禁止进行指令重排序。 底层原理 内存屏障 volatil 阅读全文
posted @ 2024-09-28 19:42 程序员Seven 阅读(635) 评论(2) 推荐(0)
摘要: 概述 在应用Sychronized关键字时需要把握如下注意点: 一把锁只能同时被一个线程获取,没有获得锁的线程只能等待; 每个实例都对应有自己的一把锁(this),不同实例之间互不影响;例外:锁对象是*.class以及synchronized修饰的是static方法的时候,所有对象公用同一把锁 sy 阅读全文
posted @ 2024-09-26 22:31 程序员Seven 阅读(537) 评论(0) 推荐(4)
摘要: 乐观锁和悲观锁 不是具体的锁,是指看待并发同步的角度 悲观锁:对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。Java中,synchronized关键字和Lock的实现类都是悲观锁。 乐观锁:乐观锁不是真的锁 阅读全文
posted @ 2024-09-25 23:51 程序员Seven 阅读(214) 评论(0) 推荐(2)
摘要: 线程状态转换 新建(New) NEW:初始状态,线程被构建,但是还没有调用start()方法。 可运行(Runnable) RUNNABLE:可运行状态,可运行状态可以包括:运行中状态和就绪状态。也就是 可能正在运行,也可能正在等待 CPU 时间片。 包含了操作系统线程状态中的 Running 和 阅读全文
posted @ 2024-09-24 23:26 程序员Seven 阅读(546) 评论(0) 推荐(2)
摘要: JMM内存模型 定义 java内存模型(即 java Memory Model,简称JMM),不存在的东西,是一个概念,约定 主要分成两部分来看,一部分叫做主内存,另一部分叫做工作内存。 java当中的共享变量;都放在主内存当中,如类的成员变量(实例变量),还有静态的成员变量(类变量),都是存储在主 阅读全文
posted @ 2024-09-23 22:23 程序员Seven 阅读(429) 评论(2) 推荐(5)
摘要: 前言 ConcurrentLinkedQueue是基于链接节点的无界线程安全队列。此队列按照FIFO(先进先出)原则对元素进行排序。队列的头部是队列中存在时间最长的元素,而队列的尾部则是最近添加的元素。新的元素总是被插入到队列的尾部,而队列的获取操作(例如poll或peek)则是从队列头部开始。 与 阅读全文
posted @ 2024-09-22 19:45 程序员Seven 阅读(1457) 评论(0) 推荐(0)
摘要: HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进行put操作,调用了HashMap的putVal(),具体原因: 假设两个线程A、B都在进行put操作,并且hash函数计算出的插入下标是相同的; 当线程A执行完第六行由于时间片耗尽导致被挂起,而线程B得到时间片后在该下标处 阅读全文
posted @ 2024-09-19 22:15 程序员Seven 阅读(511) 评论(0) 推荐(1)
摘要: 写在前面 在缓存场景下,由于内存是有限的,不能缓存所有对象,因此就需要一定的删除机制,淘汰掉一些对象。这个时候可能很快就想到了各种Cache数据过期策略,目前也有一些优秀的包提供了功能丰富的Cache,比如Google的Guava Cache,它支持数据定期过期、LRU、LFU等策略,但它仍然有可能 阅读全文
posted @ 2024-09-18 21:24 程序员Seven 阅读(387) 评论(0) 推荐(1)
摘要: 我们已经知道了如何优雅的校验传入的参数了,那么后端服务器如何实现把数据返回给前端呢? 返回格式 后端返回给前端我们一般用 JSON 体方式,定义如下: { #返回状态码 code:string, #返回信息描述 message:string, #返回值 data:object } CODE 状态码 阅读全文
posted @ 2024-09-17 20:15 程序员Seven 阅读(1364) 评论(4) 推荐(1)
摘要: 在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,在第37条中建议 用EnumMap替换序数索引,为什么? EnumSet 在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段 36、用 EnumSet替代位字段 如果枚举类型的元素主要在 阅读全文
posted @ 2024-09-13 21:19 程序员Seven 阅读(232) 评论(0) 推荐(1)
摘要: 写在前面 从一道Leetcode题目说起 首先,来看一下Leetcode里面的一道经典题目:146.LRU缓存机制,题目描述如下: 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容 阅读全文
posted @ 2024-09-12 20:33 程序员Seven 阅读(399) 评论(0) 推荐(1)
摘要: 介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也就是说TreeSet里面有一个TreeMap(适配器模式)。 Java TreeMap实现了SortedMap接口,也就是说会按照key的大小顺序对Map中的元素进行排序,key大小的评判可以通过其本身的 阅读全文
posted @ 2024-09-11 20:49 程序员Seven 阅读(282) 评论(0) 推荐(0)
摘要: 为什么不推荐使用Stack Java已不推荐使用Stack,而是推荐使用更高效的ArrayDeque 为什么不推荐使用 性能低:是因为 Stack 继承自 Vector, 而 Vector 在每个方法中都加了锁。由于需要兼容老的项目,很难在原有的基础上进行优化,因此 Vector 就被淘汰掉了,使用 阅读全文
posted @ 2024-09-10 22:16 程序员Seven 阅读(571) 评论(0) 推荐(1)
摘要: 写在前面 Spring的核心思想就是容器,当容器refresh的时候,外部看上去风平浪静,其实内部则是一片惊涛骇浪,汪洋一片。Springboot更是封装了Spring,遵循约定大于配置,加上自动装配的机制。很多时候我们只要引用了一个依赖,几乎是零配置就能完成一个功能的装配。 由spring提供的、 阅读全文
posted @ 2024-09-08 15:48 程序员Seven 阅读(4592) 评论(6) 推荐(32)
摘要: HashMap是Java中最常用的集合类框架,也是Java语言中非常典型的数据结构, 而HashSet和HashMap者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也就是说HashSet里面有一个HashMap(适配器模式)。因此了解HashMap源码也就了解HashSet了 介绍 K 阅读全文
posted @ 2024-09-07 14:59 程序员Seven 阅读(375) 评论(0) 推荐(0)
摘要: 介绍 优先级队列的作用是能保证每次取出的元素都是队列中权值最小(或最大)的。这里元素大小的评判可以通过元素本身的自然顺序(natural ordering),也可以通过构造时传入的比较器(Comparator)。 Java中PriorityQueue实现了Queue接口,不允许放入null元素;其通 阅读全文
posted @ 2024-09-05 21:05 程序员Seven 阅读(413) 评论(0) 推荐(0)
摘要: 介绍 LinkedList同时实现了List接口和Deque接口,也就是说它既可以看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(Stack)。这样看来,LinkedList简直就是个全能冠军。当你需要使用栈或者队列时,可以考虑使用LinkedList,一方面是因为Java 阅读全文
posted @ 2024-09-04 21:59 程序员Seven 阅读(98) 评论(0) 推荐(0)
摘要: Java 8的新特性之一就是流stream,配合同版本出现的 Lambda ,使得操作集合(Collection)提供了极大的便利。 案例引入 在JAVA中,涉及到对数组、Collection等集合类中的元素进行操作的时候,通常会通过循环的方式进行逐个处理,或者使用Stream的方式进行处理。 假设 阅读全文
posted @ 2024-09-03 21:35 程序员Seven 阅读(277) 评论(0) 推荐(0)
摘要: 为什么需要SPI机制 SPI和API的区别是什么 SPI是一种跟API相对应的反向设计思想:API由实现方确定标准规范和功能,调用方无权做任何干预; 而SPI是由调用方确定标准规范,也就是接口,然后调用方依赖此接口,第三方实现此接口,这样做就可以方便的进行扩展,类似于插件机制,这是SPI出现的需求背 阅读全文
posted @ 2024-09-02 21:09 程序员Seven 阅读(243) 评论(0) 推荐(1)