
java
文章平均质量分 75
java基础,jvm,多线程,高并发
吴法刚
从现在我下了一个决定把自己学习过的东西都写成文章发表出来,大家共同学习共同探讨,知识无边界。。欢迎交流技术
展开
-
test目录下没有resources可以访问main下面的配置文件?
在写单测的时候,经常是在test下写一份配置,在main下写一份数据,这样好处就是可以把配置文件隔离开,但是更多的我们是不想隔离开,我们需要写双份配置,比较操蛋,虽然是拷贝但是也不爽,maven是如何实现写一份配置的。原创 2023-06-05 07:09:03 · 304 阅读 · 0 评论 -
Java中transient关键字的详细总结
1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法被访问。(2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。(3)一个静态变量不管是否被transient修饰,均不能被序列化(如果反序列化后类中static变量还有值,则值为当前JVM中对应static变量的值)。原创 2023-04-22 16:28:30 · 143 阅读 · 0 评论 -
我在项目中Entitiy和Vo是如何优雅的转换的?
MapStruct简单的介绍一下MapStruct,一个框架的出现都要解决某个痛点,MapStruct其实就是解决对象之间的属性映射问题为什么推荐这个框架呢,下面说说原因和他的优势。原因一:很多项目大量映射通过手动get、set,这种写法非常繁琐无味,而且没有技术含量。甚至中间还牵涉了很多类型转换,嵌套之类的繁琐操作,非常的愚蠢。原因二:有人说apache的BeanUtil. copyProperties可以实现,但是性能差而且容易出异常,很多规范严禁使用这种途径。以下是对几种对象映射框架的对比,大原创 2021-04-24 16:34:28 · 1108 阅读 · 0 评论 -
在项目中用了Arrays.asList、ArrayList的subList,被老大公开批评~
说实话Arrays.asList、ArrayList的subList 这几个操作平时也用过,也没遇到过坑,不过这几个问题我确实不知道,平时也没注意过使用Arrays.asList的注意事项1、可能会踩的坑先来看下Arrays.asList的使用: //这种方式获取到的list是固定长度的 List<Integer> statusList = Arrays.asList(1, 2); System.out.println(statusList);原创 2021-03-26 22:27:30 · 255 阅读 · 0 评论 -
一文拿下单例模式的七种写法
对对对原创 2021-01-20 23:56:57 · 366 阅读 · 0 评论 -
抽象工厂
昨天我们看了下工厂方法,今天我们来看看抽象工厂,这二者有什么联系和区别吗?简单的理解: 都是为了封装创建对接而封装的模式,不同点,工厂方法是创建对象比较困难,我们使用工厂创建,减少客户端的压力,抽象工厂是解决工厂本身就很难创建的问题,所以抽象工厂又叫工厂的工厂...原创 2021-01-17 23:18:33 · 187 阅读 · 0 评论 -
工厂模式(又名静态工厂)
工厂模式简单工厂模式工厂方法简单了解下spring中如何使用工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。其实我们平时经常遇到这种模式:比如:factory. creatConnection()factory.getBean()等等这种写法我们是不是非常熟悉,只是很少去追踪这个地方底层到底怎么实现原创 2021-01-17 23:17:44 · 376 阅读 · 0 评论 -
07_阻塞队列相关理论知识学习 BlockingQueue
07_阻塞队列相关理论知识学习 BlockingQueue1.概念队列阻塞队列为什么要用?为什么需要BlockingQueue2.BlockingQueue 相关的apiBlockingQueue核心方法抛出异常组布尔类型组阻塞队列组不见不散组SynchronousQueue阻塞队列的用处生成者和消费者3.0Synchronized和Lock的区别举例1.概念队列队列就可以想成是一个数组,从一头进入,一头出去,排队买饭阻塞队列BlockingQueue 阻塞队列,排队拥堵,首先它是一个队列,而一个原创 2020-09-26 21:30:38 · 157 阅读 · 0 评论 -
06_CountDownLatch/CyclicBarrier/Semaphore
1. CountDownLatch概念让一些线程阻塞直到另一些线程完成一系列操作才被唤醒CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,调用线程就会被阻塞。其它线程调用CountDown方法会将计数器减1(调用CountDown方法的线程不会被阻塞),当计数器的值变成零时,因调用await方法被阻塞的线程会被唤醒,继续执行场景现在有这样一个场景,假设一个自习室里有7个人,其中有一个是班长,班长的主要职责就是在其它6个同学走了后,关灯,锁教室门,然后走人,因此班长是原创 2020-09-26 21:30:14 · 180 阅读 · 0 评论 -
05_一文学明白java锁
Java锁之公平锁和非公平锁概念公平锁是指多个线程按照申请锁的顺序来获取锁,类似于排队买饭,先来后到,先来先服务,就是公平的,也就是队列非公平锁是指多个线程获取锁的顺序,并不是按照申请锁的顺序,有可能申请的线程比先申请的线程优先获取锁,在高并发环境下,有可能造成优先级翻转,或者饥饿的线程(也就是某个线程一直得不到锁)如何创建并发包中ReentrantLock的创建可以指定析构函数的boolean类型来得到公平锁或者非公平锁,默认是非公平锁/*** 创建一个可重入锁,true 表示公平锁,f原创 2020-09-26 21:29:43 · 213 阅读 · 0 评论 -
03_LongAdder 源码分析
03_LongAdder 源码分析AtomicLong 和 LongAdder对比AtomicLongLongAdderLongAdder和AtomicLong性能测试LongAdder为什么这么快1、 设计思想上,LongAdder采用**"分段"的方式降低CAS失败的频次**2、**使用Contended注解来消除伪共享****3、惰性求值**LongAdder源码剖析上文中我们分析了:CAS底层实现是在一个死循环中不断地尝试修改目标值,直到修改成功。如果竞争不激烈的时候,修改成功率很高,否则失败率很原创 2020-09-26 06:40:41 · 230 阅读 · 0 评论 -
01_一文对Volatile深度理解
谈谈对Volatile的理解一个面试题进行展开的知识点相关知识:JUC(java.util.concurrent)进程和线程进程:后台运行的程序(我们打开的一个软件,就是进程)线程:轻量级的进程,并且一个进程包含多个线程(同在一个软件内,同时运行窗口,就是线程)并发和并行并发:同时访问某个东西,就是并发并行:一起做某些事情,就是并行JUC下的三个包java.util.concurrentjava.util.concurrent.atomicjava.util.concurren原创 2020-09-22 07:11:39 · 174 阅读 · 0 评论 -
java8 时间日期api
==========================================================原创 2020-09-21 19:57:06 · 438 阅读 · 0 评论 -
Optional类
Optional类概念Optional类是一个容器类,代表一个值存在或者不存在,原来null表示一个值不存在,现在Optional可以更好的表达这个概念,并且可以规避空指针异常常用方法Optional.of:创建一个Optional实例Optional.empty:创建一个空的Optional实例Optional.ofNullable:若t不为null,创建optional实例,否者创建一个空实例isPresent:判断是否包含值orElse(T t):如果对象包含值,则返回该值,否则返回t原创 2020-09-20 20:57:15 · 286 阅读 · 0 评论 -
并行流与顺序流
并行流并行流就是把一个内容分成多个数据库,并用不同的线程分别处理每个数据块的流Java8中将并行流进行了优化,我们可以很容易的对数据进行并行操作,Stream API可以声明性的通过parallel() 与 sequential() 在并行流与顺序流之间进行切换Fork/Join框架概念Fork/Join框架:就是在必要的情况下,将一个大任务,进行拆分(fork)成若干个小任务(拆到不可再拆时),再将一个个小的任务运算的结果进行join汇总采用 工作窃取 模式当执行新的任务时,它可以将其拆分原创 2020-09-20 20:44:25 · 1041 阅读 · 0 评论 -
Java8新特性之三:Stream API
文章目录什么是StreamStream操作三个步骤第一步创建流中间操作筛选与切片Stream中间操作--映射什么是StreamJava8的两个重大改变,一个是Lambda表达式,另一个就是本节要讲的Stream API表达式。Stream 是Java8中处理集合的关键抽象概念,它可以对集合进行非常复杂的查找、过滤、筛选等操作,在新版的JPA中,也已经加入了Stream流(Stream): 是数据渠道,用于操作数据源(集合,数组等)所生成的元素序列.集合讲的是数据,流讲的是计算注意:Stream原创 2020-09-20 18:21:57 · 129 阅读 · 0 评论 -
java lamdda 表达式
基本语法:3 部分1 左侧:一个括号内用逗号分隔的形式参数,参数是函数式接口里面方法的参数2 中间:一个箭头符号:->3 右侧:方法体,可以是表达式和代码块,方法体函数式接口里面方法的实现,如果是代码块,则必须用{}来包裹起来,且需要一个return 返回值,但有个例外,若函数式接口里面方法返回值是void,则无需{}...原创 2020-09-20 12:30:27 · 412 阅读 · 0 评论 -
JVM_12 垃圾回收3-垃圾回收器
1. GC的分类与性能指标垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。从不同角度分析垃圾收集器,可以将GC分为不同的类型。1.1 按线程数分,可以分为串行垃圾回收器和并行垃圾回收器串行回收指的是在同一时间段内只允许有一个CPU用于执行垃圾回收操作,此时工作线程被暂停,直至垃圾收集工作结束。➢在诸如单CPU处理器或者较小的应用内存等硬件平台不是特别优越的场合,串行回收器原创 2020-09-18 05:31:52 · 1874 阅读 · 0 评论 -
JVM_11 垃圾回收2-垃圾回收相关概念
JVM_11 垃圾回收2-垃圾回收相关概念1. System.gc()的理解2.内存溢出与内存泄漏2.1 内存溢出2.2 内存泄漏(Memory Leak)2.3 举例3. Stop The World3.1测试代码4. 垃圾回收的并行与并发4.1并发(Concurrent)4.2 并行(Parallel)4.3 二者对比4.4 垃圾回收的并发与并行5. 安全点与安全区域5.1 安全点(Safepoint)5.2 安全区域(Safe Region)6.引用6.1 强引用: 不回收6.2 软引用: 内存不足即原创 2020-09-18 05:10:36 · 1555 阅读 · 0 评论 -
JVM_10 垃圾回收1-概述+相关算法
1.概述1.1 什么是垃圾?什么是垃圾( Garbage) 呢? ➢垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。 ➢外文: An object is considered garbage when it can no longer be reached from any pointer in the runningprogram.如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一直保留到应用程序结束,被保留的空间无法被其他对象使用。甚至可能导致内存原创 2020-09-11 19:23:07 · 1745 阅读 · 0 评论 -
JVM_09 字符串常量池StringTable
1.2字符串常量池中是不会存储相同内容的字符串的。String的String Pool 是一个固定大小的Hashtable,默认值大小长度是1009。如果放进StringPool的String非常多, 就会造成Hash冲突严重,从而导致链表会很长,而链表长了后直接会造成的影响就是当调用String. intern时性能会大幅下降。使用一XX: StringTableSize可设置StringTable的长度在jdk6中StringTable是固定的,就是1009的长度,所以如果常量池中的字符串过多就原创 2020-09-11 04:45:45 · 1542 阅读 · 0 评论 -
JVM_08 执行引擎(Execution Engine)
1. 执行引擎概述执行引擎是Java虚拟机的核心组成部分之一虚拟机是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM锁识别的字原创 2020-09-08 18:49:42 · 1827 阅读 · 0 评论 -
JVM_07 运行时数据区4-对象的实例化内存布局与访问定位+直接内存
大厂面试题?美团:对象在jvm 中怎么存储的?对象头信息里面有哪些东西?蚂蚁金服:二面: java对象里面有什么?1.对象的实例化1.1 创建对象的方式new最常见的方式变形1 : Xxx的静态方法变形2 : XxBuilder/XxoxFactory的静态方法Class的newInstance():反射的方式,只能调用空参的构造器,权限必须是publicConstructor的newInstance(Xxx):反射的方式,可以调用空参、带参的构造器,权限没有要求使用clon原创 2020-09-06 17:13:17 · 1641 阅读 · 0 评论 -
JVM_06 运行时数据区3-方法区
1. 堆、栈、方法区的交互关系原创 2020-09-06 15:18:31 · 1564 阅读 · 0 评论 -
JVM_05 运行时数据区2-堆
1.核心概述一个进程对应一个jvm实例,一个运行时数据区,又包含多个线程,这些线程共享了方法区和堆,每个线程包含了程序计数器、本地方法栈和虚拟机栈。一个jvm实例只存在一个堆内存,堆也是java内存管理的核心区域Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间(堆内存的大小是可以调节的)– 堆空间大小可以调节《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的所有的线程共享java堆,在这里还可以划分线程私有的原创 2020-09-05 19:51:36 · 1617 阅读 · 0 评论 -
JVM_04 本地方法接口
本地方法简单来讲,一个Native Method就是一个java调用非java代码的接口,一个Native Method 是这样一个java方法:该方法的实现由非Java语言实现,比如C。这个特征并非java特有,很多其他的编程语言都有这一机制,比如在C++ 中,你可以用extern “C” 告知C++ 编译器去调用一个C的函数。在定义一个native method时,并不提供实现体(有些像定义一个Java interface),因为其实现体是由非java语言在外面实现的。本地接口的作用是融合不同的编原创 2020-09-02 19:29:13 · 1641 阅读 · 0 评论 -
JVM_03 运行时数据区1-[程序寄存器+虚拟机栈+本地方法栈]
1. 内存 与 线程1.1 内存内存是非常重要的系统资源,是硬盘和cpu的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了JAVA在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的jvm对于内存的划分方式和管理机制存在着部分差异(对于Hotspot主要指方法区)java虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的,这些与线程对应的数据区域会随着线程开始和.原创 2020-09-02 19:28:32 · 1773 阅读 · 0 评论 -
04_集合类线程不安全问题
Collection线程不安全的举例单线程环境和多线程下效果如何单线程环境的ArrayList是不会有问题的@Test public void test1(){ //单线程是没问题问题的 我们非常熟悉 List<String> list = new ArrayList<>(); list.add("dd"); list.add("aa"); list.add("bb"); l原创 2020-08-29 16:55:14 · 456 阅读 · 0 评论 -
JVM_02 类加载子系统
类加载器分类原创 2020-08-29 14:56:56 · 1653 阅读 · 2 评论 -
02_CAS底层原理
概念CAS的全称是Compare-And-Swap,它是CPU并发原语它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的CAS并发原语体现在Java语言中就是sun.misc.Unsafe类的各个方法。调用UnSafe类中的CAS方法,JVM会帮我们实现出CAS汇编指令,这是一种完全依赖于硬件的功能,通过它实现了原子操作,再次强调,由于CAS是一种系统原语,原语属于操作系统用于范畴,是由若干条指令组成,用于完成某个功能的一个过程,并且原语的执行必须是连续的,在执行过程中原创 2020-08-27 06:16:22 · 689 阅读 · 0 评论