
Java基础
文章平均质量分 73
炎升
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
maven的settings.xml、pom.xml配置文件
maven的配置文件主要有 settings.xml 和pom.xml 两个文件。其中在maven安装目录下的settings.xml,如:D:\Program Files\apache-maven-3.6.3\conf\settings.xml 是全局配置文件用户目录的.m2子目录下的settings.xml,如:C:\Users\chenxc.m2\settings.xml 配置只是针对当前用户的配置文件。项目根路径下的pom.xml主要是对当前项目的配置。局部配置优先于全局配置。原创 2024-04-09 15:00:11 · 1880 阅读 · 1 评论 -
maven依赖管理:依赖仓库管理
答案是:可以把上面的标签配置到Maven的setting.xml文件中,配置在标签内。原创 2024-04-07 11:29:15 · 3742 阅读 · 0 评论 -
ThreadLocal学习
java.lang.ThreadLocal类实现了线程的本地存储。【强引用】:1、threalLocal对象指向threalLocalMap中的key .2、线程对象 指向 堆中的 threalLocalMap。【弱引用】:1、threalLocalMap 的key为 threadLocal对象,即threadLocal对象 指向key为弱引用。原创 2023-07-12 16:05:56 · 408 阅读 · 0 评论 -
并发编程学习(十四):tomcat线程池
Tomcat 的核心功能有两个,分别是负责接收和反馈外部请求的连接器 Connector,和负责处理请求的容器 Container。其中连接器和容器相辅相成,一起构成了基本的 web 服务 Service。每个 Tomcat 服务器可以管理多个 Service。ConnectorContainer由 Engine、Host、Context和Wrapper 四个容器组成ServiceConnector 和 Container 两个核心组件。原创 2023-05-31 14:27:38 · 2692 阅读 · 0 评论 -
并发编程学习(十二):字段更新器、原子累加器
字段更新器,主要是用来更新自定义类的字段。注意的是:字段更新器要操作(原子操作)哪个字段,哪个字段必须被 volatile 修饰,否则会出现异常。运行结果:102020。原创 2023-05-12 09:17:13 · 586 阅读 · 1 评论 -
并发编程学习(十):共享模式无锁、原子整数、原子引用类型
获取共享变量时,为了保证该变量的可见性,需要使用volatile修饰。它可以用来修饰成员变量和静态成员变量,它可以避免线程从自己的工作缓存中查找变量,必须到主存中获取它的值,线程操作volatile变量都是直接操作主存,即一个线程对volatile变量的修改,对另一个线程可见。注意:volatile仅仅保证了共享变量的可见性,让其它线程能够开到新值,但不能解决指令交错问题(不能保证原子性)。CAS必须借助volatile才能读取到共享变量的最新值来实现【比较和交换】的效果。原创 2023-05-11 15:45:11 · 599 阅读 · 0 评论 -
并发编程学习(十一):原子数组、
方法名说明创建给定长度的新创建与给定数组具有相同长度的新,并从给定数组复制其所有元素方法名说明创建与给定数组具有相同长度的新,并从给定数组复制其所有元素。这个构造方法传入一个数组对象时,该数组对象必须是引用类型,int[]不可以,但是Integer[]的可以创建给定长度的新 AtomicReferenceArray。为数组的每一位设置什么值是没有要求的,类似于Map的形式。原创 2023-05-11 17:20:34 · 831 阅读 · 0 评论 -
DecimalFormat的用法: 数字格式化
DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字。它支持不同类型的数,包括整数 (123)、定点数 (123.4)、科学记数法表示的数 (1.23E4)、百分数 (12%) 和金额 ($123)。所有这些内容都可以本地化。DecimalFormat 包含一个模式 和一组符号 ,在做数字格式化时,DecimalFormat还是比较方便的。常用于保留小数点后几位、数字间用,分割、四舍五入等场合。符号位置本地化含义0数字是阿拉伯数字数字是。原创 2023-02-21 23:15:56 · 1535 阅读 · 0 评论 -
并发编程学习(九):同步模式之顺序控制、交替打印
同步模式之顺序控制、交替打印原创 2023-01-31 11:03:09 · 695 阅读 · 0 评论 -
并发编程学习(八):ReentrantLock特性、哲学家吃饭问题
ReentrantLock 是java.util.concurrent.locks包下的类。相对于synchronized,它具备如下特性:可中断。可以设置超时时间。可以设置公平锁。支持多个条件变量。即可以有个多个waitset等待队列。与synchronized都支持可重入。可冲入是指 同一个线程如果首次获得了这把锁,那么因为它是这把锁的拥有者,因此有权利再次获取这把锁。如果是不可冲入锁,那么第二次获取锁时,自己会被锁挡住。原创 2023-01-30 14:41:25 · 983 阅读 · 1 评论 -
并发编程学习(六):park、unpark
它们是LockSupport类中的方法,内部调用的是Unsafe类中的native方法。RUNNINGLockSupport.unpark(要恢复的线程对象);先park再unpark的方式是容易理解的。但还有一个场景,先unpark后再次执行park方法,也不会阻塞调用了park方法的线程。理解为park方法就是校验获取一个通行令牌,而unpark方法是获取到一个通行令牌的过程。先执行unpark方法,代表先获得了通行令牌。原创 2022-12-23 17:57:19 · 2021 阅读 · 0 评论 -
并发编程学习(五):设计模式~同步模式之保护性暂停
保护性暂停 即Guarded Suspension,用于在一个线程等待另一个线程的执行结果。要点:有一个结果需要从一个线程传递到另一个线程,让它们关联同一个对象GuardedObject。如果有结果不断从一个线程到另一个线程,那么可以使用消息队列。JDK中,join的实现、Future的实现,采用的就是此模式。原创 2022-12-22 15:57:48 · 1139 阅读 · 0 评论 -
并发编程学习(四):wait()、nitify()
线程通信:wait() / notify() / notifyAll() 此三个方法定义在Object类中的。obj.wait() 让进入object监视器的线程 到waitset等待。obj.notify()在object上正在waitSet等待的线程挑一个唤醒。obj.notifyAll()让object上正在waitSet等待的线程全部唤醒。它们都是线程之间进行协作的手段,都属于Object对象的方法。必须获得此对象obj的锁,才能调用这几个方法。wait() 方法会释放对象的锁。原创 2022-12-22 14:57:09 · 1057 阅读 · 0 评论 -
并发编程学习(三):主线程、守护线程
2、tomcat中的acceptor和poller线程都是守护线程,所以tomcat接收到shutdown命令后,不会等待它们处理完当前请求。调用Thread的 isDaemon() ,可以返回该线程是否为守护线程。返回true-守护线程。调用Thread的 setDaemon(true) ,代表设置该线程为守护线程。,只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制结束。默认情况下,java进程需要等待所有线程都运行结束,才会结束。1、 垃圾回收器线程就是一种守护线程。原创 2022-12-19 11:33:26 · 142 阅读 · 0 评论 -
并发编程学习(二):两阶段终止模式(two phase termination)
在一个线程t1中如何优雅的终止线程t2?这里的优雅指的是给t2一个料理后事的机会。该行为是为了防止while(true) 占用大量的内存资源,通过睡眠2s可以大幅度减少内存消耗。,会抛出异常,并清除打断标记,所以需要线程内部自己重新设置打断标记。原创 2022-12-13 15:48:05 · 169 阅读 · 0 评论 -
并发编程学习(一):Thread类中的常用的方法
1.启动当前线程;调用当前线程的run()。start方法只是让线程进入就绪,里面的代码不一定立刻运行(CPU的时间片还没分给它)。每个线程对象的start方法只能调用一次,如果调用多次会出现IllegalThreadStateException.2. run(): 通常需要重写Thread类中的此方法,将创建的线程要执行的操作声明在此方法中.3. currentThread():静态方法,返回执行当前代码的线程4. getName():获取当前线程的名字。原创 2022-12-13 15:10:08 · 727 阅读 · 0 评论 -
创建线程的几种方式
新启线程的方式:方式一、扩展自Thread类 private static class UseThread extends Thread{ @Override public void run() { super.run(); // do my work; System.out.println("I am extends Thread"); } }方式二、实现Runnable接口 p...原创 2020-07-17 10:47:09 · 946 阅读 · 0 评论 -
kafka学习(七):消息队列与JMS
Apache Kafka是一个开源消息系统,由Scala写成。是由Apache软件基金会开发的一个开源消息系统项目,目标是为处理实时数据提供一个统一、高通量、低等待的平台,Kafka被广泛地应用于各种流式计算中。原创 2022-11-25 09:53:26 · 2101 阅读 · 0 评论 -
List集合排序
Java中集合排序,在Java8之前,可以通过 Collections类的sort方法进行排序;Java8之后,新增 lambda和stream ,都增加了相关的排序方法,本文将整理下常见的三种排序方法。说明:排序字段出现null值 会报错。原创 2022-09-29 14:25:43 · 2229 阅读 · 0 评论 -
socket流程图
从图中可以看出,当客户端调用connect时,触发了连接请求,向服务器发送了SYN J包,这时connect进入阻塞状态;服务器监听到连接请求,即收到SYN J包,调用accept函 数接收请求向客户端发送SYN K ,ACK J+1,这时accept进入阻塞状态;客户端收到服务器的SYN K ,ACK J+1之后,这时connect返回,并对SYN K进行确认;服务器收到ACK K+1时,accept返回,至此三次握手完毕,连接建立。原创 2022-08-24 15:25:04 · 1928 阅读 · 0 评论 -
IO、BIO、NIO、AIO
关注的是。:被调用方做完内部所有事情后再返回,同步调用的调用者一定会得到被调用方的结果。:被调用方先返回,再做事情,做完所有事情后再通知调用方(回调方法),异步调用方不会立即得到被调用方的结果,而是当被调用方执行完成后通过回调函数处理该结果。原创 2022-08-24 14:59:40 · 788 阅读 · 0 评论 -
Java的4种引用类型
java为引用类型专门定义了一个类叫做。Reference是跟java垃圾回收机制息息相关的类,通过探讨Reference的实现可以更加深入的理解java的垃圾回收是怎么工作的。引用的结构图如下:引用队列是为了配合SoftReference、WeakReference、PhantomReference使用,它们三个在GC回收之前会被放到引用队列里ReferenceQueue保存下。原创 2022-08-23 10:08:13 · 3006 阅读 · 0 评论 -
cache line 缓存行
程序局部性原理,可以提高效率,充分发挥总线CPU针脚等一次性读取更多数据的能力。这些协议是怎么生效的,如上图中x被改了之后他给自己标记成Modified,然后数据写回内存后通知其他核,给他们的这个缓存行状态改成Invalid,意思就是告诉他们我改过了,你们这个都无效了,如果需要用到最新数据,重新去内存中取。在多核CPU就会遇到这样一个问题,xy的数据在一个缓存行,第一个核将x改了,第二个核将y改了,他们再使用另一个值的时候,他们都不知道值变了,这就是缓存一致性的问题,怎么来解决这个问题呢?原创 2022-08-22 16:14:39 · 2555 阅读 · 0 评论 -
java内存模型、volatile关键字、synchronized
volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatile关键字的实现原理,最后给出了几个使用volatile关键字的场景。原创 2022-08-20 14:20:41 · 1303 阅读 · 0 评论 -
高并发学习-20220816-锁升级
前提:使用synchronized给object对象加锁。1、刚new出的 object对象,是没有上锁的。-- 无锁2、如果同一时刻只有一个线程在使用object对象 这把锁,则将从 无锁-升级为-偏向锁。object对象头markwod中会写入当前线程指针。3、只要发生锁竞争,及同一个时刻还有其他线程在竞争这把锁,则 将从 偏向锁-升级为-轻量级锁(也叫自旋锁)。升级过程为:①撤销偏向锁。......原创 2022-08-18 10:52:32 · 355 阅读 · 0 评论 -
java锁升级
我们简称为。原创 2022-08-17 17:30:26 · 4346 阅读 · 0 评论 -
linux内核态和用户态
用户态和内核态是操作系统的两种运行级别,两者最大的区别就是特权级不同。转载 2022-08-17 14:25:45 · 431 阅读 · 0 评论 -
hashCode 的作用
以java.lang.Object来理解,JVM每new一个Object,它都会将这个Object丢到一个Hash哈希表中去,这样的话,下次做Object的比较或者取这个对象的时候,它会根据对象的hashcode再从Hash表中取这个对象。这样做的目的是提高取对象的效率。...转载 2022-08-16 16:21:27 · 464 阅读 · 0 评论 -
什么是CAS
CAS : compare and swap 比较和交换。: 中间 改过值,但最终又回到0 了。例如:原值:0线程1:读取 0, 要将0 改为 1。但没改之前,发现以下操作,所以线程1在将0改为1时,这个0已经不是之前的0 了。线程2: 读取 0,将值改为 2。线程3: 读取2,将值改为 0。ABA问题 的简单理解:你的女朋友在离开你的这段儿时间经历了别的人,自旋就是你空转等待,一直等到她接纳你为止。:加版本号。基础类型简单值不需要版本号。......原创 2022-08-10 16:32:16 · 151 阅读 · 0 评论 -
JOL(java object layout): java 对象内存布局
JOL的全称是Java Object Layout 即 java 对象内存布局。是一个用来分析JVM中Object布局的小工具。包括Object在内存中的占用情况,实例对象的引用情况等等。JOL可以在代码中使用,也可以独立的以命令行中运行。命令行的我这里就不具体介绍了,今天主要讲解怎么在代码中使用JOL。.....................转载 2022-08-10 15:25:52 · 4093 阅读 · 0 评论 -
Spring Boot 2.X默认连接池HikariCP详解
在开始说明Spring Boot中的数据源配置之前,我们先搞清楚关于数据访问的这些基本概念: Java数据库连接(Java Database Connectivity,简称JDBC)是Java语⾔中⽤来规范客户端程序如何来访问数据库的应⽤程序接⼝,提供了诸如查询和更新数据库中数据的⽅法。JDBC也是Sun Microsystems的商标。我们通常说的JDBC是⾯向关系型数据库的。 JDBC API主要位于JDK中的java.sql包中(之后扩展的内容位于javax.sql包中),原创 2022-06-03 16:00:15 · 3545 阅读 · 1 评论 -
Log日志追踪之MDC
MDC(Mapped Diagnostic Context,映射调试上下文)是Slf4j(提供了接口定义和核心实现,日志库负责适配器的实现)提供的一种方便在多线程条件下记录日志的功能。MDC 可以看成是一个与当前线程绑定的Map,可以往其中添加键值对。MDC 中包含的内容可以被同一线程中执行的代码所访问。当前线程的子线程会继承其父线程中的 MDC 的内容。当需要记录日志时,只需要从 MDC 中获取所需的信息即可。MDC 的内容则由程序在适当的时候保存进去。对于一个 Web 应用来说,通常是在请求被处理的最开原创 2022-06-01 16:43:49 · 6279 阅读 · 0 评论 -
格式化输出json字符串
1、使用阿里的FastJson1.1、pom依赖<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.58</version></dependency>1.2、示例代码import com.alibaba.fastjson.JSON;import co原创 2022-05-27 11:37:24 · 1810 阅读 · 0 评论 -
JDBC 之ResultSetMetaData获取列名字
利用jdbc连接数据库查询时,通常返回的结果就是每行数据的键值对集合。这时我们需要知道查询出来的数据有哪些字段。根据ResultSet结果集得到的ResultSetMetaData就可以获取到每个字段的名称。其中主要用getColumnLabel(intcolumn)和getColumnName(intcolumn)两种方法来获取。ResultSetMetaData:用于获取关于ResultSet对象中列的类型和属性信息的对象; ResultSetMetaData...原创 2021-12-06 15:44:23 · 5074 阅读 · 0 评论 -
java 8 Collectors.toMap 重复key 值处理、value为null处理
public static void main(String[] args) { // 查询客户主证件信息 代码省略 // 获取客户证件列表 List<Map<String,Object>> custCertificateList = (List<Map<String, Object>>) idenMap.get("custCertificateList"); // 将证件以客户维度封装,该写法如果一个客户出现多个主证件.原创 2021-11-30 19:00:06 · 10560 阅读 · 0 评论 -
Java8 常用接口函数
1.常用函数是接口:(1)Function<T, R> => R apply(T t)————接受一个T类型的参数,返回R类型结果。Function<Integer, String> function1 = (x) -> "result: " + x;function1.apply(6);(2)Consumer<T> => void accept(T t)————接受一个T类型的参数,无返回。Consumer<Stri...原创 2021-11-24 14:48:27 · 389 阅读 · 0 评论 -
lombok常用注解
原文:https://blog.youkuaiyun.com/weixin_41540822/article/details/86606535常用注解示例:Lombok常用注解 - 草木物语 - 博客园1、maven依赖<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18....原创 2021-11-24 14:35:17 · 3887 阅读 · 1 评论 -
String.format 学习
1、介绍String类的 format()方法用于创建格式化的字符串以及连接多个字符串对象。format()方法有两种重载形式。// 使用当前本地区域对象(Locale.getDefault()),制定字符串格式和参数生成格式化的字符串String String.format(String fmt, Object... args);// 自定义本地区域对象,制定字符串格式和参数生成格式化的字符串String String.format(Locale locale, Stri...原创 2021-11-01 13:50:15 · 1129 阅读 · 0 评论 -
二进制正数、负数说明
我们已经知道计算机中,所有数据最终都是使用二进制数表达。1、java8种基本数据类型占用字节:表示范围公式:(-2的n-1次方) 至 (2的n-1次方 - 1); 因为第一位用于当做符号位,第1个bit表示符号,0表示正数,1表示负数。基本类型 占的内存(1字节是8位) 表示范围 byte 1字节 -128至127:-2的7次方至2的7次方-1 short 2字节 -32768至32767:-2的15次方至2的15次方-1原创 2021-08-12 10:28:21 · 2816 阅读 · 0 评论 -
java 获取主机信息
package com.example.demo.host;import java.net.InetAddress;import java.net.UnknownHostException;import java.util.Properties;/** * 获取服务器主机信息 */public class SystemInfo { public static void main(String[] args) { // 1、获取主机信息 try.原创 2021-08-06 18:00:34 · 514 阅读 · 0 评论