java
懒的去其
这个作者很懒,什么都没留下…
展开
-
JDK的SPI技术
SPI(Service Provide Interface)是动态加载的一种实现(基于接口的编程,具体的实现类通过配置文件里指定完整类名,然后通过反射拿到class,进而拿到对象)。常见的实现例如JDBC,SLF4J,SpringBoot里的starter组件等,只指定接口,具体的实现类进行动态指定。1 完整代码案例1.1先定义一个接口package com.tom.blog.spi;public interface SPIservice { void execute...原创 2020-11-15 23:48:56 · 213 阅读 · 0 评论 -
Java 数据结构
List:ArrayList(数组):线程不安全内部结构:transient Object[] elementData; 总结:1索引查询( get(0) )/插入( add("xxx") )复杂度为O(1);指定位置插入(add(3,"xxx"))的复杂度为O(n)2默认容量大小为10,每次扩容为1.5倍3 指定位置插入和扩容会需要复制数组,底层是调用Sys...原创 2019-10-25 09:13:37 · 192 阅读 · 0 评论 -
Java JVM
1 运行时内存数据1.1 线程私有:虚拟机栈:每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表(基础数据类型+对象引用),操作数栈,方法返回信息等数据。从方法调用直至执行完成的过程对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程。注:当线程请求栈的深度超过当前Java虚拟机栈的最大深度的时候,就抛出SOF异常当线程请求栈时内存用完了,无法再动态扩展会抛...原创 2019-08-26 09:05:08 · 345 阅读 · 0 评论 -
Synchronized实现原理
参考1 参考21 Synchronized的三种应用方式1.1 修饰实例方法对象锁,进入同步代码需要获得当前实例对象的锁1.2 修饰静态方法类锁,进入同步代码需要获得当前类对象的锁1.3 修饰代码块对象锁,进入同步代码库前要获得给定对象的锁2 Synchronized实现互斥锁通过管程对象(又称monitor对象或监视器锁),每个对象都存在...原创 2019-08-29 13:34:00 · 162 阅读 · 0 评论 -
Java volatile
前景提示:(多核CPU下)每次线程从内存里读写线程共享的变量,会将内存的变量复制到CPU缓存里再进行读写,导致内存的数据发生变化,处于某个CPU的线程不一定能拿到已经发生变化的实时数据,读写的是CPU缓存的数据MESI(缓存一致性协议):当CPU写数据时,如果发现操作的变量是共享变量,即在其他CPU中也存在该变量的副本,会发出信号通知其他CPU将该变量的缓存行置为无效状态,因此当...原创 2019-08-30 10:57:10 · 116 阅读 · 0 评论 -
Java 强引用 软引用 弱引用 虚引用 ThreadLocal
强引用规则:使用最普遍的引用,当内存空间不足,JVM宁愿抛出OutOf MemoryError错误,都不会回收它 // 通过new产生,user就是个强引用 User user = new User();软引用规则:系统内存不足时,将会把这些对象列进回收范围进行GC回收 byte[] cacheData = n...原创 2019-09-03 13:25:46 · 795 阅读 · 0 评论 -
AQS
参考文档1 参考文档2AQS(AbstractQueuedSynchronizer),是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的ReentrantLock,Semaphore,其他的诸如ReentrantReadWriteLock,SynchronousQueue,FutureTask等等皆是基于AQS的AQS核心思想:如果被请...原创 2019-09-10 15:45:25 · 137 阅读 · 0 评论 -
spring 修改返回内容的编码格式
第一种:直接使用produces @GetMapping(value = "login/home",produces = "text/html;charset=gb2312") @ResponseBody public void login1() { return "我";}第二种:response.setContentType 配合 response.ge...原创 2019-09-11 16:22:32 · 951 阅读 · 0 评论 -
Java NIO
1 buffer/cache共同点:通过减少访问硬盘/内存的次数提升效率1.1.1buffer(缓冲):从硬盘读取大量数据放到缓冲区供程序使用例如下面读取文件的代码,如果每次读取100个字节都去访问硬盘则效率非常低。所以可以每次读取硬盘时读取大量数据到缓冲区,用户需要时直接从缓冲区去取,缓冲区没有数据时再重新去读取硬盘 File file = new File(...原创 2019-09-29 09:53:07 · 406 阅读 · 1 评论 -
匿名内部类访问final修饰的方法成员变量
问题:匿名内部类访问方法成员变量时,该变量必须加上final,否则编译不通过public class Main { public void useMyInterface() { final Integer num = 23; MyInterface myInterface = new MyInterface() { @Over...原创 2019-10-10 14:00:30 · 328 阅读 · 0 评论 -
Java HashMap解析
HashMap:数组+链表(或红黑树)Hash碰撞:所谓“碰撞”就是多个hash值不同的元素计算得出同一个桶(相同的数组下标),在put时出现冲突桶:数组里的每一个元素Q:怎么计算key对应的数组下标?A:put()方法里,将hash值和(数组容量-1)进行异或(&)操作(取hash的低位)注:在put()方法里,需要根据hash值拿到对应的数组下标:...原创 2019-08-06 17:39:40 · 862 阅读 · 0 评论 -
取模运算和取余运算
对于整数 a,b 来说,取模运算(mod)或者取余运算(rem)的方法要分如下两步:1、求整数商:c=a/b2、计算模或者余数:r=a-(c*b)求模运算和求余运算在第一步不同取余运算在计算商值向0方向舍弃小数位取模运算在计算商值向负无穷方向舍弃小数位例如:1.ab符号位不一致时:4/(-3) 约等于 -1.3在取余运算时候商值向 0 方向舍弃小数位为...原创 2019-08-08 16:52:33 · 3666 阅读 · 0 评论 -
Centos 安装jdk/切换jdk版本
安装方式(例如jdk1.8):1 官网下载解压1.1 下载解压官网地址:https://www.oracle.com/technetwork/java/javase/downloads/java-archive-javase8-2177648.html下载后解压,比如解压到/usr/local/下,文件目录为/usr/local/jdk1.8.0_2011.2 设置环境变量...原创 2019-02-11 13:49:33 · 118991 阅读 · 0 评论 -
Java 包装类和基础类的问题(编码习惯)
Eg:Long long显然:如果实体类的字段设置为包装类时,当包装类是Null,转换会失败我们在写代码时,最好直接用Long 传递到Long。否则,Long 转 long时,必须要判断Null防止出现空指针。正如上图所示,这种靠java拆箱装箱的,Long是null时直接报错,应该保持一致,用Long接收Long。...原创 2019-03-28 21:48:46 · 32943 阅读 · 0 评论 -
Java 线程池
1 线程池public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue);public ThreadPoolExecutor(int corePoolSize,int ma...原创 2019-09-03 17:18:19 · 154 阅读 · 0 评论 -
IO 同步 异步 阻塞 非阻塞
参考:https://blog.csdn.net/historyasamirror/article/details/5778378一个IO操作(文件IO / 网络IO)包括两步:第一步:数据复制到内核空间第二步:数据从内核空间复制到用户空间几种常见I/O模型的对比:阻塞IO:阻塞直到2个阶段都完成非阻塞IO:第一步立即会返回结果,error表示数据没...原创 2019-09-10 22:08:04 · 163 阅读 · 0 评论 -
Java各种锁
1 乐观锁/悲观锁1.1乐观锁定义:总是假设最好的情况,认为每次读取数据都不会有人修改,适合读多写少的情况规则:读和写都不会加锁,但是更新的时候去判断该数据有没有被更新(属于从代码逻辑上实现的锁)实现:1.1.3.1 版本号机制定义:每次读取数据不会上锁,只有在写入的时候会判断该记录有没有被更新,没有则更新失败具体实现:数据库添加版本号(version字段),在一次事务...原创 2019-06-28 12:11:18 · 728 阅读 · 1 评论 -
过滤器和拦截器
过滤器:@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("before..."); ...原创 2019-07-24 09:04:18 · 719 阅读 · 0 评论 -
java基础 基本位运算
1. 2进制和10进制转换1.1 2转10Java:Integer.valueOf("0101",2).toString;1.2 10转2JAVA:Integer.toBinaryString(int i);2.原码/补码/反码在Java中,所有正数/负数 的表示方式都是以补码形式来表示正数:原码、反码、补码相同负数:对原码进行符号位...转载 2019-08-06 13:50:25 · 823 阅读 · 0 评论 -
一致性Hash算法
常规Hash(散列)是通过取模将数据均匀的放置在各个节点,在网络请求里适合用于负载均衡(例如nginx里可以配置成Hash的负载,确保每个IP的请求走固定服务器)。常规hash取余(取模):这样的配置不需要Session共享,因为每次IP都是访问固定服务器。问题来了 :一旦某台机器崩掉了或者想增加一台机器抗压,此时hash取模时,原本IP访问的固定服务器会改变(可能所有已登录的用户...原创 2019-08-09 17:01:57 · 743 阅读 · 0 评论 -
opening registry key 'Software/JavaSoft/Java Runtime Environment
在系统有多个jdk版本时,出现这个问题。环境变量设置是正确的,但是仍然报错,这是因为系统有多个jdk版本,按以下办法彻底卸载其他jdk:(例如保留jdk1.8)1 在控制面板里卸载jdk;2 在注册表里删除整个JavaSoft(官网下载exe时会有注册表信息)运行regedit注册表位置:HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\3 cm...原创 2018-12-20 20:49:46 · 168517 阅读 · 5 评论