闫同学的Java学习
jvm、jmm、垃圾回收算法、hashmap底层、乐观锁与悲观锁、cas、持续更新中...
YanYeFa
专业Java开发者,阿里巴巴、腾讯、百度等国内知名互联网公司产品使用者
展开
-
Java对象、list集合与JSONObject、JSONArray、JSONString
首先创建一个Student对象:public class Student { int age; String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } pub原创 2020-09-27 10:03:49 · 240 阅读 · 0 评论 -
IDEA中默认常用快捷键
ctrl+ait+b=进入实现类ctrl+shift+f=全局搜索ait+鼠标跳格选择ctrl+alt+←返回上一步操作处ctrl+alt+v 生成返回值对象快捷键alt+←或→左右切换已打开的类ctrl+r搜索并替换ctrl+o查看并选择继承覆盖当前类的方法shift+箭头 左右选择一位ctrl+箭头 左右跳一个完整的单词ctrl++shift+箭头 左右选全一个完整的单词补充:如果快捷键无效,可能是被QQ、微信等其它引用占用所致。......原创 2020-09-27 09:56:54 · 1141 阅读 · 0 评论 -
Linux操作系统
一、Linux介绍 1.当前已知的操作系统有哪些:Windows、IOS、Android、车载系统、嵌入式系统、Linux 2. Linux是一款主要用于服务器的操作系统,免费、开源、安全、稳定、高效率,尤其是进行高并发处理时性能强悍,目前很多企业级系统都部署在Linux系统上. 3.Linux的发行版:Ubuntu、RedHat(redhat、CentOS)、Suse、FedOra、红旗Linux 4.Unix和Linux:Unix是一款收费的商业软件(操作系统),Linux是一款响应GN原创 2020-09-25 11:14:04 · 2183 阅读 · 1 评论 -
springcloud中各组件汇总
a)服务注册中心:Eureka(X),Zookeeper,Consul,Nacosb)服务调用:Ribbon,LoadBanlancer,Feign(X),OpenFeignc)服务熔降级:Hystrix(X),resilience4j,sentinel(阿里)d)服务网关:Zuul(X),Zuul2,gatewaye)服务配置:Config(X),Nacosf)服务总线:Bus(X),Nacos带X符号的表示停更或即将弃用Hystrix:1.服务降级fallback:程序运行异常,超时,服原创 2020-09-23 15:46:04 · 299 阅读 · 0 评论 -
二叉树与二分查找
1.基础种类 完全二叉树: 完全二叉树,移除最后一层节点后是满二叉树,且最后一层的节点都连续集中在最左面。 满二叉树:国际标准定义是除了叶结点外每一个结点都有左右子结点的二叉树;国内的定义是:除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。下图按照国际标准属于满二叉树,按照国内标准显然不是。 平衡二叉树:是一棵空树或它的任意节点的左右两个子树的高度差的绝对值不超过12.遍历: 前序遍历:root -> left -> right 中序遍历:left -&原创 2020-09-22 14:02:08 · 793 阅读 · 0 评论 -
线性结构和非线性结构
i.线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系。 ii.线性结构拥有两种不同的存储结构,即顺序存储结构和链式存储结构。顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的,链式存储的线性表称为链表,链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息。 iii.线性结构中存在两种操作受限的使用场景,即队列和栈。栈的操作只能在线性表的一端进行,就是我们常说的先进后出(FILO),队列的插入操作在线性表的一端进行而其他操作在线性表的另一端进行,先原创 2020-09-22 10:31:54 · 220 阅读 · 0 评论 -
红黑树
红黑树(自平衡的二叉查找树)底层数据结构为(特殊的二叉树)二分查找树,避免二叉树退化为链表而诞生 什么是“二叉树退化”?如下图: 大家知道二叉搜索树的的深度即为时间复杂度,即同为3元素,左侧时间复杂度为2,右侧时间复杂度为3,可见数据结构对查询效率的影响,这也就是所谓的“二叉树退化”。 其实没有什么数据结构是一诞生就是完美的,回顾红黑树的演化史:链表->二叉树->二叉查找树->特殊的二叉查找树(自平衡二叉树) 数据结构演化史体现在代码中,就像hashmap的底层,最原创 2020-09-22 10:28:29 · 156 阅读 · 0 评论 -
创建servlet的3种方式及注册到tomcat的3种方式
创建:(1)实现servlet接口(2)继承GenericServlet 类(3)继承HttpServlet 类注册:(1)通过xml配置(2)通过WebServic()注解(3)通过创建tomcat对象,手动add原创 2020-09-21 10:14:47 · 383 阅读 · 1 评论 -
Jetty和Tomcat
Jetty和Tomcat Jetty可以同时处理大量连接而且可以长时间保持连接,适合于web聊天应用等等。而且按需加载组件,减少了服务器的内存开销,内部默认采用NIO异步处理等特性提高了服务器性能。配置更加的灵活、简单、开发效率快、扩展性强。 从技术上来说的话,Jetty不是一个功能全面的J2EE服务器,缺少很多对J2EE功能的支持。而Tomcat适合处理少数非常繁忙的链接,也就是说链接生命周期短的请求服务。它自身扩展了大量的J2EE特性来满足各种企业项目应用的需求,对于很多的Java web项原创 2020-09-21 10:13:08 · 162 阅读 · 0 评论 -
Java中线程的分类:用户线程与守护线程
线程分为两种,用户线程和守护线程 其实守护线程和用户线程区别不大,可以理解为特殊的用户线程。特殊就特殊在如果程序中所有的用户线程都退出了,那么所有的守护线程就都会被杀死,很好理解,没有被守护的对象了,也不需要守护线程了。 用户线程的启动就是线程调用start方法,就是我们平时使用new Thread()对象,或者实现Runable()接口创建的线程,当然也可以直接通过匿名内部类启动。 启动守护线程也有两种方法,先来看看怎么启动守护线程 。 最常用的一种是通过将用户线程转换为守护线程来启动原创 2020-09-21 10:08:06 · 252 阅读 · 0 评论 -
常见端口号记录
1.mysql 33062.sql server 14333.oricle 15214.redis 63795.tomcat 80806.elasticsearch 9200欢迎各位在评论区补充!原创 2020-09-21 10:02:33 · 515 阅读 · 1 评论 -
springboot中base64前端编码与后端解码
当前端向后端传递的参数含非法字符时(tomcat由于版本升级,考虑安全性,将一些字符判定为非法字符,当然可以通过降低tomcat版本,或者增添配置来更改,但是这些都不是好的方法),可采用前端base64编码后再传向后端,后端再解码即可,毕竟编码后这些特定字符就像被转化为二进制一样,可以随意传输了。前端编码:function b64EncodeUnicode(str) { return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g原创 2020-09-21 09:20:03 · 2417 阅读 · 0 评论 -
Java中高并发解决方案
(1)代码层面 锁优化措施、尽量简化事务和减少事务(2)应用层面 缓存 队列 限流 熔断(3)数据库层面 分库分表 读写分离(4)集群与分布式 数据库集群和库表散列,服务器集群(5)应用和静态资源分离(6)反向代理 反向代理指的是客户端直接访问的服务器并不真正提供服务,它从别的服务器获取资源然后将结果返回给用户。反向代理服务器和代理服务器的区别: 代理服务器的作用是代我门获取想要的资源然后将结果返回给我们,所要获取的资源是我门主动告诉代理服务器的,比如,我门想访问Fa原创 2020-09-18 09:38:23 · 244 阅读 · 1 评论 -
spring使用了哪些设计模式
(1)简单工厂模式 (2)工厂方法模式 (3)单例模式在单线程中实现单例模式Singleton* getInstance(){ lock(); if (instance == NULL) { instance = new Singleton(); } unlock(); return instance;}多线程中实现单例模式Singleton* getInstance(){ if (instance == NUL原创 2020-09-17 14:18:03 · 218 阅读 · 2 评论 -
在接口实现类中,加不加@Override的区别
简单来说@override注解是告诉编译器,下面的方法是重写父类的方法。 如果不写@override注解去直接重写方法,编译器是不会判断你是不是正确重写了父类中的方法的。如重写方法时参数与父类不同,程序是不会提示报错的。这会留下一个潜在的bug。 当你写了@override注解时,程序会判断你是否正确的重写了父类的对应方法。而且加上此注解后,程序会自动屏蔽父类的方法。补充: 一般来说,写与不写没什么区别,JVM可以自识别。 写的情况下:即说明子类要覆盖基类的方法,基类必须存在方法 (控原创 2020-09-17 11:11:58 · 6824 阅读 · 1 评论 -
AQS
AQS,AbstractQueuedSynchronizer,抽象的队列式的同步器,其定义了一套多线程访问共享资源的同步器框架。 AQS是基于CLH队列,用volatile修饰共享变量state,线程通过CAS去改变状态符,成功则获取锁成功,失败则进入等待队列,等待被唤醒。 AQS的核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并将共享资源设置为锁定状态,如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队原创 2020-09-17 09:08:40 · 76 阅读 · 0 评论 -
Java中的四种引用:强软弱虚
强引用 M m=new M(),M在没有引用指向时被回收,也可通过System.gc()回收。 软引用 SoftReference:SoftReference<byte[]> m=new SoftReference<byte[]>(new byte[1024102410]);在堆内存不够用时被回收,一般用于缓存上面。主要是垃圾回收器来实现。 弱引用 WeakReference:在System.gc();时被回收,防止内存泄漏。 虚引用 PhantomReference原创 2020-09-17 08:45:54 · 80 阅读 · 0 评论 -
Java对象的eqauls方法和hashCode方法是这样规定的
a)、相等(相同)的对象必须具有相等的哈希码(或者散列码)。 b)、如果两个对象的hashCode相同,它们并不一定相同。 关于第一点,相等(相同)的对象必须具有相等的哈希码(或者散列码),为什么?想象一下,假如两个Java对象A和B,A和B相等(eqauls结果为true),但A和B的哈希码不同,则A和B存入HashMap时的哈希码计算得到的HashMap内部数组位置索引可能不同,那么A和B很有可能允许同时存入HashMap,显然相等/相同的元素是不允许同时存入HashMap,HashMap不原创 2020-09-16 11:09:14 · 141 阅读 · 0 评论 -
NIO
nio,java.nio全称java non-blocking IO,非阻塞式的,java非阻塞式IO又称new io NIO和IO到底有什么区别?有什么关系?首先说一下核心区别: 例如serverSocket编程,服务端阻塞后,等待客服端接入。这就是阻塞io。此时两处阻塞,等待客服端接入阻塞,接入后,等待客户端传入数据,又阻塞. NIO是以块的方式处理数据,但是IO是以最基础的字节流的形式去写入和读出的。所以在效率上的话,肯定是NIO效率比IO效率会高出很多。 NIO不在是和IO一样原创 2020-09-16 11:02:28 · 84 阅读 · 0 评论 -
ThreadLocal
ThreadLocal 的作用: ThreadLocal是解决线程安全问题一个很好的思路,它通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题。在很多情况下,ThreadLocal比直接使用synchronized同步机制解决线程安全问题更简单,更方便,且结果程序拥有更高的并发性。 ThreadLocal的应用场景: 在Java的多线程编程中,为保证多个线程对共享变量的安全访问,通常会使用synchronized来保证同一时刻只有一个线程对共享变量进行操作。这种情况下可以将类变原创 2020-09-16 10:54:37 · 69 阅读 · 0 评论 -
Java中锁的四种状态
无锁(new对象的时候)偏向锁轻量级锁(无锁,自旋锁,自适应锁)重量级锁 这四种锁是指锁的状态,专门针对synchronized的。(锁只能升级,不能降级【锁降级发生在gc阶段,即锁降级在某些特定情况下会发生,没有意义,可认为不存在】) 锁升级过程:首先new一个对象的时候,是无锁状态,第一次上锁是偏向锁,有人争用,升级为轻量级锁,争用状态或竞争状态变得激烈,升级为重量级锁 锁消除lock eliminate:如一个方法中的局部变量不断调用.append()方法,此时锁会消失,因为局.原创 2020-09-16 09:04:04 · 540 阅读 · 0 评论 -
Lock接口和synchronized内置锁和reentrantlock重入锁
synchronized: Java提供的内置锁机制,Java中的每个对象都可以用作一个实现同步的锁(内置锁或者监视器Monitor),线程在进入同步代码块之前需要或者这把锁,在退出同步代码块会释放锁。而synchronized这种内置锁实际上是互斥的,即每把锁最多只能由一个线程持有。 Lock接口: Lock接口提供了与synchronized相似的同步功能,和synchronized(隐式的获取和释放锁,主要体现在线程进入同步代码块之前需要获取锁退出同步代码块需要释放锁)不同的是,Loc原创 2020-09-16 08:57:06 · 143 阅读 · 0 评论 -
CAS
CAS(Compare-and-Swap)即比较并替换,是一种实现并发算法时常用到的技术,,采用“乐观锁”技术,Java并发包中的很多类都使用了CAS技术 底层:机器指令,汇编语言 lock cmpxchg 指令,该指令非原子性的,例如在cmpare的时候,值被修改。lock确实体现了原子性,意思是当执行后面cmpxchg时,其它cpu不允许对值进行修改CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,(否则,其它线程修改为不同值,原创 2020-09-15 14:16:31 · 69 阅读 · 0 评论 -
乐观锁与悲观锁
悲观锁 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。 乐观锁 总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在原创 2020-09-15 14:08:59 · 58 阅读 · 0 评论 -
JDK1.8的hashmap底层长这样
HashMap底层:数组+链表(+红黑树), 是一个采用hash表(散列表)实现键值对集合,继承 AbstractMap,实现了Map接口。HashMap 先通过哈希运算,得到目标元素在哈希表中的值,然后再进行少量比较即可得到元素,这使得HashMap的查找效率更高。 哈希冲突:当我们对某个元素进行哈希运算,得到一个存储地址,然后要进行插入的时候,发现已经被其他元素占用了,其实这就是所谓的哈希冲突,也叫哈希碰撞。 哈希冲突解决方法:由于hash表即散列表的存在,往往会出现哈希冲突,也就是散列冲突原创 2020-09-15 09:42:05 · 285 阅读 · 0 评论 -
垃圾回收算法
垃圾回收器的机制: 垃圾回收器是一个优先级很低的一个线程,它会在根据一定的机制来去回收那些没有被任何引用指向的对象,并调用其finalize()方法回收其内存。垃圾回收器回收是有自己的规则,我们无法手动去调用。但是可以使用System.gc()方法来通知GC回收垃圾,但是回不回收由它自己的算法决定,当然内存剩余越少gc肯定回收的越频繁的。 垃圾回收算法: Mark-Sweep(标记-清除)算法:标记-清除算法分为两个阶段:标记阶段和清除阶段。标记阶段的任务是标记出所有需要被回收的对象,清除阶原创 2020-09-14 17:39:56 · 161 阅读 · 1 评论 -
JVM和JMM对比讲解
一、JVM JVM全称JAVA Virtual Machine,java虚拟机,由以下五部分组成方法区java堆java栈程序计数器(寄存器)本地方法栈 栈内存:栈内存首先是一片内存区域,存储的都是局部变量,凡是定义在方法中的都是局部变量(方法外的是全局变量),for循环内部定义的也是局部变量,是先加载函数才能进行局部变量的定义,所以方法先进栈,然后再定义变量,变量有自己的作用域,一旦离开作用域,变量就会被释放。栈内存的更新速度很快,因为局部变量的生命周期都很短。 堆内原创 2020-09-11 15:02:01 · 509 阅读 · 0 评论