
java进阶
youngerTree
热爱技术、热爱开发
展开
-
JMM 内存间交互操作
Java内存模型规定了所有的变量都存储在主存中,每个线程都有自己的工作内存,工作内存中保存了该线程要用到的主存中变量的副本,线程对变量的操作都是在工作内存中完成,不能直接操作主存,线程之间也无法直接访问其他线程的工作内存,线程间变量值的传递需要通过主存来完成,这就涉及到了主存与工作内存间的交互操作。Java内存模型中定义了8种操作来完成,虚拟机保证了每种操作都是原子的。lock(锁定):作用于主存的变量,把一个变量标识为一条线程独占状态。 unlock(解锁):作用于主存变量,把一个处于锁定状态的原创 2020-07-23 23:37:45 · 521 阅读 · 2 评论 -
JVM:System.gc
当我们调用System.gc()的时候,其实并不会马上进行垃圾回收,甚至不一定会执行垃圾回收,查看系统源码可以看到 /** * Indicates to the VM that it would be a good time to run the * garbage collector. Note that this is a hint only. There is no guarantee * that the garbage collector will ac原创 2020-07-23 23:05:45 · 159 阅读 · 0 评论 -
JVM:对象什么时候会进入老年代
JVM堆中有新生代、老年代两块区域,因为使用分代回收策略新生代还会划分为Eden和两个Survivor区,JVM堆大概是这样子:程序运行过程中新产生的对象都会分配在Eden区,随着时间的推移Eden区也是会满的,那么这个时候就会进行Minor GC进行清理,清理过程有的对象被清除,有的对象会继续存活下去。那Java对象啥时候会进入老年代呢?根据对象年龄JVM会给对象增加一个年龄(age)的计数器,对象每“熬过”一次GC,年龄就要+1,待对象到达设置的阈值(默认为15岁)就会被移移动到老年代.原创 2020-07-22 23:24:55 · 4568 阅读 · 0 评论 -
JVM: G1和CMS的区别
CMS:以获取最短回收停顿时间为目标的收集器,基于并发“标记清理”实现过程:1、初始标记:独占PUC,需要STW(Stop the world),仅标记GCroots能直接关联的对象,速度很快。2、并发标记:可以和用户线程并行执行,无需STW,标记所有可达对象3、重新标记:独占CPU(STW),为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录。这个阶段的停顿时间一般会比初始标记阶段稍长一些,但远比并发标记的时间要短。4、并发清理:可以和用户线程并行执行,原创 2020-07-22 22:55:24 · 4119 阅读 · 0 评论 -
线程池的三种队列区别:SynchronousQueue、LinkedBlockingQueue 和ArrayBlockingQueue
1.SynchronousQueueSynchronousQueue没有容量,是无缓冲等待队列,是一个不存储元素的阻塞队列,会直接将任务交给消费者,必须等队列中的添加元素被消费后才能继续添加新的元素。拥有公平(FIFO)和非公平(LIFO)策略,非公平侧罗会导致一些数据永远无法被消费的情况?使用SynchronousQueue阻塞队列一般要求maximumPoolSizes为无界(Integer.MAX_VALUE),避免线程拒绝执行操作。2.LinkedBlockingQueue..原创 2020-06-13 22:24:08 · 1269 阅读 · 0 评论 -
JAVA中的五种线程池,四种拒绝策略,三种阻塞队列
三种阻塞队列:BlockingQueue<Runnable> workQueue = null;workQueue = new ArrayBlockingQueue<>(5);//基于数组的先进先出队列,有界workQueue = new LinkedBlockingQueue<>();//基于链表的先进先出队列,无界workQueue = new SynchronousQueue<>();//无缓冲的等待队列,无界四...原创 2020-06-13 22:19:14 · 556 阅读 · 0 评论 -
HashSet实现原理
1.是基于HashMap实现的,默认构造函数是构建一个初始容量为16,负载因子为0.75 的HashMap。封装了一个 HashMap 对象来存储所有的集合元素,所有放入 HashSet 中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个 PRESENT,它是一个静态的 Object 对象。2.当我们试图把某个类的对象当成 HashMap的 key,或试图将这个类的对象放入 HashSet 中保存时,重写该类的equals(Object obj)方原创 2020-06-05 23:15:06 · 331 阅读 · 0 评论 -
JAVA锁有哪些种类,以及区别
JAVA会涉及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类。介绍的内容如下:公平锁/非公平锁 可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/悲观锁 分段锁 偏向锁/轻量级锁/重量级锁 自旋锁公平锁/非公平锁公平锁是指多个线程按照申请锁的顺序来获取锁。非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。有可能,会造成优先级反转或者饥饿现象。对于JavaReentrantLock而言,通过构造函数指定该锁是否是公平锁,.原创 2020-06-01 21:45:06 · 430 阅读 · 0 评论 -
Spring boot集成@Retryable实现重连机制
1.pom引入相关依赖: <dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> </dependency>2.在启动类加入:@EnableRetry注解3....原创 2020-04-08 12:49:30 · 590 阅读 · 0 评论 -
在Spring boot中使用@Async注解
@Async顾名思义就是异步调用的意思,使用线程在Spring boot中使用方便。1.在启动类加入@EnableAsync注解/** * springboot启动器 * @author zsy */@EnableAsync@MapperScan(basePackages = "com.ismartgo.*.mapper")@SpringBootApplication...原创 2020-03-08 22:06:14 · 821 阅读 · 0 评论 -
Spring cloud Hystrix设计原则和特性
Hystrix设计原则 1.防止单个服务的故障,耗尽整个系统服务的容器(比如tomcat)的线程资源,避免分布式环境里大量级联失败。通过第三方客户端访问(通常是通过网络)依赖服务出现失败、拒绝、超时或短路时执行回退逻辑 2.用快速失败代替排队(每个依赖服务维护一个小的线程池或信号量,当线程池满或信号量满,会立即拒绝服务而不会排队等待)和优雅的服务降级;当依赖服务失效后又恢复正...原创 2019-07-02 16:31:25 · 415 阅读 · 0 评论 -
策略模式实例
本文主要通过一个使用策略模式的实例来帮助读者了解策略模式。策略模式体现了面向对象程序设计中非常重要的两个原则:封装变化的概念。编程中使用接口,而不是使用的是具体的实现类(面向接口编程)。类图:其优点:1.上下文和具体策略是松耦合关系。因此上下文只知道它要使用某一个实现Strategy接口类的实例,但不需要知道具体是哪一个类。2.策略模式满足“...原创 2019-07-07 22:17:29 · 2585 阅读 · 0 评论 -
服务雪崩效应
服务雪崩效应的定义服务雪崩效应是一种因服务提供者的不可用导致服务调用者的不可用,并将不可用逐渐放大的过程。服务雪崩效应形成的原因 我把服务雪崩的参与者简化为服务提供者和服务调用者, 并将服务雪崩产生的过程分为以下三个阶段来分析形成的原因: 服务提供者不可用 重试加大流量 服务调用者不可用 服务雪崩的每个阶段都可能由不同的原因造成, 比如造成...原创 2019-07-07 22:05:32 · 1355 阅读 · 0 评论 -
Fork/Join 框架
Fork/Join 框架是 JDK 1.7 提供的一个用于并行执行任务的框架,其核心理念是把一个大任务分割成若干个小任务进行窃取执行,然后最终汇总每个小任务结果后得到大任务结果的并发框架。Fork 就是把一个大任务切分为若干子任务进行并行执行,Join 就是合并这些子任务的最终执行结果得到这个大任务的结果。Fork/Join 框架采用了工作窃取(work-stealing)算法来实现,其算法核...原创 2019-06-23 22:00:11 · 137 阅读 · 0 评论 -
初识CAS
CAS(compare and swap)实质就是比较交换策略,设计并发算法时常用到的一种技术,java.util.concurrent 包基本都建立在 CAS 之上,现代的处理器基本都支持 CAS,只是不同厂商实现不同而已;CAS 有内存值V、旧的预期值A、要修改的值B三个操作数,当且仅当预期值A和内存值V相同时才会将内存值修改为B并返回 true,否则什么也不做且返回 false。CAS ...原创 2019-06-23 21:57:47 · 249 阅读 · 0 评论 -
Spring cloud之Ribbon搭建
本文搭建一个Ribbon实现负载均衡的效果pom文件:<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:sc...原创 2019-06-23 20:54:48 · 366 阅读 · 1 评论 -
Spring cloud之Ribbon初识
Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随即连接等)去连接这些机器。同时我们可以很容易地使用Ribbon实现自定...原创 2019-06-22 23:10:27 · 139 阅读 · 0 评论 -
Spring cloud之eureka服务注册
上一章搭建了eureka注册中心,这章就写搭建一个client服务注册到注册中心上去。pom文件:<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-ins...原创 2019-06-18 18:53:05 · 258 阅读 · 0 评论 -
Spring boot集成jxls实现导入功能
首先上添加maven依赖: <!-- jxsl dependency for poi --> <dependency> <groupId>org.jxls</groupId> <artifactId>jxls-poi</artifactId> <version>${jxsl.poi.v...原创 2019-06-11 22:13:24 · 3043 阅读 · 0 评论 -
Spring boot集成jxls实现导出excel功能
添加的maven依赖: <!-- jxsl dependency for poi --> <dependency> <groupId>org.jxls</groupId> <artifactId>jxls-poi</artifactId> <version>${jxsl.poi.ver...原创 2019-06-11 22:06:42 · 2172 阅读 · 0 评论 -
Spring cloud之eureka搭建
这篇文章为大家搭建一个eureka项目,主要展示其服务发现的功能:首先添加pom依赖,如果使用idea创建maven项目时可以直接选择相关依赖,这里使用eclipse手把手搭建:<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:x...原创 2019-06-18 18:52:50 · 675 阅读 · 0 评论 -
Spring cloud初识Hystrix
当系统发生大量请求时会阻塞在服务器上,影响其它整个服务.在复杂的分布式架构的应用程序有很多的依赖,都会不可避免地在某些时候失败.高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险.Spring Cloud Netflix Hystrix就是隔离措施的一种实现,可以设置在某种超时或者失败情形下断开依赖调用或者返回指定逻辑,从而提高分布式系统的稳定性.生活中举个例子,如电力过载保护...原创 2019-07-02 16:31:15 · 133 阅读 · 0 评论 -
Spring cloud之Hystrix流程
Hystrix流程说明: 1:每次调用创建一个新的HystrixCommand,把依赖调用封装在run()方法中. 2:执行execute()/queue做同步或异步调用. 4:判断熔断器(circuit-breaker)是否打开,如果打开跳到步骤8,进行降级策略,如果关闭进入步骤5. 5:判断线程池/队列/信号量是否跑满,如果跑满进入降级步骤8,否则继续后续步骤6. 6...原创 2019-07-02 15:58:06 · 129 阅读 · 0 评论 -
线程池中 submit() 和 execute() 方法的区别
execute():只能执行 Runnable 类型的任务。 submit():可以执行 Runnable 和 Callable 类型的任务。 submit()能获取返回值(异步)以及处理Exception。execute()方法不行。...原创 2019-05-25 23:40:15 · 1728 阅读 · 0 评论 -
@ControllerAdvice自定义异常返回格式
@ControllerAdvicepublic class EpExceptionHandler { @ExceptionHandler(value = Exception.class) @ResponseBody public Map<String, Object> allExceptionHandler(Exception e){ Map&l...原创 2019-08-23 15:19:17 · 1018 阅读 · 0 评论 -
Spring boot配置redis共享session
配置类:import org.springframework.context.annotation.Configuration;import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;/** * 使用redis共享session的配置(暂不使用),使用...原创 2019-08-23 15:17:06 · 201 阅读 · 0 评论 -
Spring boot整合出现Circular view path [error]: would dispatch back to the current handler URL问题
这个问题主要是Spring boot整合jsp时出现的问题把jsp放到webapp文件夹还需要在pom加入<resources> <resource> <directory>src/main/webapp</directory> 注意jsp必须...原创 2019-08-17 12:50:00 · 6629 阅读 · 0 评论 -
HttpURLConnection怎么设置请求头
在调用application/json格式的接口时经常用到HttpURLConnection,HttpURLConnection设置请求头通过setRequestProPerty(name,value)方法,就能向header里添加信息。原创 2019-08-17 12:45:31 · 39396 阅读 · 0 评论 -
Spring如何注入静态的bean
在日常开发中某些工具类的静态方法需要使用到service或者dao,而java的语法要求静态方方法的只能调用静态变量,下面为注入静态bean的例子。/** * @author zsy */@Componentpublic class WxghOnceMsgHelper { private static EpMsgSendRecordMapper msgSendRecordMapp...原创 2019-08-13 20:48:27 · 611 阅读 · 0 评论 -
Spring cache常用注解
上面文章从spring boot + spring cache + redis搭建了一个例子,这篇文章主要讲解spring cache常用注解的使用。而spring cache的常用注解有:@Cacheable、@CachePut、@CacheEvict。@Cacheable、@CachePut、@CacheEvict 注释介绍通过上面的例子,我们可以看到 spring cache 主...原创 2019-08-13 20:44:21 · 287 阅读 · 0 评论 -
Spring cloud Hystrix实例
前面文章讲述了Hystrix相关内容,这篇文章主要是搭建一个Hystrix实例。pom文件<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache....原创 2019-07-10 18:15:48 · 670 阅读 · 0 评论 -
数据库索引之B树
什么是B树B树,如上图,它的特点是:(1)多叉结构;(2)叶子节点,非叶子节点,都存储数据;(3)中序遍历,可以获得所有节点;B树被作为实现索引的数据结构被创造出来,是因为它能够完美的利用“局部性原理”。什么是局部性原理局部性原理的逻辑是这样的:(1)内存读写块,磁盘读写慢,而且慢很多;(2)磁盘预读:磁盘读写并不是按需读取,而是按页预读,一次会...原创 2019-07-14 20:55:32 · 227 阅读 · 0 评论 -
数据库索引初识
数据库索引很多人都知道是加快数据查询速度的,但是对其原理却是一知半解。首先抛出问题数据库为什么要设计索引?图书馆存了1000W本图书,要从中找到《数据库原理》这本书,如果一本一本地查,要查到什么时候?于是,图书管理员设计了一套规则:(1)一楼放文学类,二楼放科技类,三楼放计算机类…(2)计算机类,又分软件类,硬件类…(3)软件类,又按照书名音序排序…通过这种方式能快速找...原创 2019-07-14 20:50:06 · 132 阅读 · 0 评论 -
设计模式的六大原则
1、开闭原则(Open Close Principle)开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。2、里氏代换原则(Liskov Substitution Principle)里氏代换原则是面...原创 2019-07-08 15:31:49 · 149 阅读 · 0 评论 -
Spring cloud之eureka初识
服务发现是基于微服务架构的关键原则之一。Netflix服务发现服务器和客户端是Eureka。可以将服务器配置和部署为高可用性,每个服务器将注册服务的状态复制到其他服务器。 当然,目前也存在较多的基于服务发现的中间件,下图对其进行了一些比较:服务的健康检查Euraka 使用时需要显式配置健康检查支持;Zookeeper,Etcd 则在失去了和服务进程的连接...原创 2019-06-11 21:30:50 · 164 阅读 · 0 评论 -
Spring boot常用启动器
Spring boot启动器。Spring boot是由一系列启动器组成的,这些启动器构成一个强大的灵活的开发助手。开发人员根据项目需要,选择并组合相应的启动器,就可以快速搭建一个适合项目需要的基础运行框架。Spring boot 提供的启动器:spring-boot-starter 核心模块,包含自动配置支持、日志库和对 YAML 配置文件的支持。spring-boot-start...原创 2019-06-16 20:36:08 · 3329 阅读 · 0 评论 -
Spring boot设置定时器类的简单方法
直接上代码:package com.ismartgo.uqcode.schedule;import java.util.Date;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotat...原创 2019-06-10 20:56:36 · 805 阅读 · 0 评论 -
什么是 XSS 攻击,如何避免
XSS 攻击:即跨站脚本攻击,它是 Web 程序中常见的漏洞。原理是攻击者往 Web 页面里插入恶意的脚本代码(css 代码、Javascript 代码等),当用户浏览该页面时,嵌入其中的脚本代码会被执行,从而达到恶意攻击用户的目的,如盗取用户 cookie、破坏页面结构、重定向到其他网站等。预防 XSS 的核心是必须对输入的数据做过滤处理。下面是XssFilter的代码:impo...原创 2019-05-29 21:00:33 · 2956 阅读 · 0 评论 -
JVM 的垃圾回收器
Serial:最早的单线程串行垃圾回收器。 Serial Old:Serial 垃圾回收器的老年版本,同样也是单线程的,可以作为 CMS 垃圾回收器的备选预案。 ParNew:是 Serial 的多线程版本。 Parallel 和 ParNew 收集器类似是多线程的,但 Parallel 是吞吐量优先的收集器,可以牺牲等待时间换取系统的吞吐量。 Parallel Old 是 Paralle...原创 2019-05-30 13:21:11 · 242 阅读 · 0 评论 -
final 在 Java 中的作用及内存意义
作用:final 修饰的类叫最终类,该类不能被继承。 final 修饰的方法不能被重写。 final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。内存屏障:内存屏障(Memory Barier,或者有时叫做内存栅栏,Memory Fence)是一种CPU指令,用于控制特定条件下的重排序和内存可见性问题。Java编译期也会根据内存屏障的规则禁止重排序。内存屏障可以...原创 2019-05-22 20:49:57 · 1646 阅读 · 0 评论