java
文章平均质量分 83
java
fanjia2shao
这个作者很懒,什么都没留下…
展开
-
乐观锁和悲观锁
乐观锁和悲观锁乐观锁概念乐观锁实现方式MybatisPlus使用乐观锁悲观锁乐观锁概念乐观锁:顾名思义,就是十分乐观,它总是认为不会出现问题,无论干什么都不去上锁~,如果出现了问题,再次更新值测试,这里使用了version字段。也就是每次更新的时候同时维护一个version字段乐观锁实现方式取出记录时,获取当前的version更新时,带上这个version执行更新时,set version = newVersion where version = oldVersion如果version不原创 2021-01-29 16:52:38 · 72 阅读 · 0 评论 -
线程池
Java中有哪些方法获取多线程前言Callable接口ThreadPoolExecutor为什么用线程池线程池的好处架构说明创建线程池底层实现线程池的重要参数拒绝策略线程池底层工作原理线程池运行架构图文字说明以顾客去银行办理业务为例,谈谈线程池的底层工作原理为什么不用默认创建的线程池?手写线程池采用默认拒绝策略采用CallerRunsPolicy拒绝策略采用 DiscardPolicy 拒绝策略采用DiscardOldestPolicy拒绝策略线程池的合理参数前言获取多线程的方法,我们都知道有三种,还有原创 2021-01-29 16:09:14 · 603 阅读 · 2 评论 -
Java的锁(四)
Java锁之自旋锁描述优缺点手写自旋锁描述自旋锁:spinlock,是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU原来提到的比较并交换,底层使用的就是自旋,自旋就是多次尝试,多次访问,不会阻塞的状态就是自旋。优缺点优点:循环比较获取直到成功为止,没有类似于wait的阻塞缺点:当不断自旋的线程越来越多的时候,会因为执行while循环不断的消耗CPU资源手写自旋锁通过CAS操作完成自旋锁,A线程先进来调用myLoc原创 2021-01-29 15:40:56 · 107 阅读 · 0 评论 -
Java的锁(三)
可重入锁和递归锁概念代码作用可重入锁验证证明Synchronized证明ReentrantLock概念可重入锁就是递归锁指的是同一线程外层函数获得锁之后,内层递归函数仍然能获取到该锁的代码,在同一线程在外层方法获取锁的时候,在进入内层方法会自动获取锁也就是说:线程可以进入任何一个它已经拥有的锁所同步的代码块ReentrantLock / Synchronized 就是一个典型的可重入锁代码可重入锁就是,在一个method1方法中加入一把锁,方法2也加锁了,那么他们拥有的是同一把锁publi原创 2021-01-29 15:37:14 · 72 阅读 · 0 评论 -
Java的锁(二)
Java锁之公平锁和非公平锁概念如何创建两者区别题外话概念公平锁是指多个线程按照申请锁的顺序来获取锁,类似于排队买饭,先来后到,先来先服务,就是公平的,也就是队列非公平锁是指多个线程获取锁的顺序,并不是按照申请锁的顺序,有可能申请的线程比先申请的线程优先获取锁,在高并发环境下,有可能造成优先级翻转,或者饥饿的线程(也就是某个线程一直得不到锁)如何创建并发包中ReentrantLock的创建可以指定析构函数的boolean类型来得到公平锁或者非公平锁,默认是非公平锁/*** 创建一个可重原创 2021-01-29 15:31:59 · 64 阅读 · 0 评论 -
Java的锁(一)
独占锁(写锁) / 共享锁(读锁) / 互斥锁概念为什么会有写锁和读锁代码实现解决方法概念独占锁:指该锁一次只能被一个线程所持有。对ReentrantLock和Synchronized而言都是独占锁共享锁:指该锁可以被多个线程锁持有对ReentrantReadWriteLock其读锁是共享,其写锁是独占写的时候只能一个人写,但是读的时候,可以多个人同时读为什么会有写锁和读锁原来我们使用ReentrantLock创建锁的时候,是独占锁,也就是说一次只能一个线程访问,但是有一个读写分离场景,读的时原创 2021-01-29 15:24:06 · 188 阅读 · 0 评论 -
Stream API
Stream API了解Stream什么是StreamStream操作的三部曲创建流中间操作终止操作Stream流的操作筛选与切片映射排序终止操作规约收集了解StreamJava8中有两个比较大的改变Lambda表达式Stream API (java.util.stream.*)Stream是Java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找,过滤和映射数据等操作。使用Stream API对集合数据进行操作,就类似于使用SQL执行的数据库查询,也可以使用S原创 2021-01-29 15:08:41 · 77 阅读 · 0 评论 -
Lambda表达式
Lambda表达式为什么要用Lambda表达式实例代码策略设计模式匿名内部类Lambda表达式学习Lambda函数式接口场景训练Java内置函数接口Comsumer 消费型接口Supplier 供给型接口Function 函数型接口Predicate 断言型接口扩展为什么要用Lambda表达式Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码,将代码像数据一样传递,这样可以写出更简洁、更灵活的代码,作为一个更紧凑的代码风格,使Java语言表达能力得到了提升实例代码La原创 2021-01-29 10:34:20 · 108 阅读 · 0 评论 -
HashMap浅谈
HashMap浅谈HashMap1.7HashMap1.7存在死链问题HashMap每次扩容为什么是2倍JDK1.8结构变化为什么HashMap使用红黑树而不是AVL树总结ConcurrentHashMap变化为何JDK8要放弃分段锁?弃用的原因新的同步方案ConcurrentHashMap为什么要使用synchronized而不是如ReentranLock这样的可重入锁?锁的粒度Hash冲突扩容为什么是用Synchronized 而不是 ReentrantLock?减少内存开销获得JVM支持HashMa原创 2021-01-29 10:16:56 · 159 阅读 · 0 评论 -
浅谈ArrayList及扩容机制
浅谈ArrayList及扩容机制ArrayListArrayList相关问题ArrayList优缺点ArrayList和Vector的区别扩容机制add方法ensureCapacityInternal方法ensureExplicitCapacity方法grow方法总结ArrayListArrayList就是动态数组,其实就是Array的复杂版本,它提供了动态的添加元素和删除元素的方法,同时实现了Collection 和 List接口,能够灵活的设置数组的大小。通过源码的分析,我们可以看到ArrayLi原创 2021-01-28 16:13:21 · 220 阅读 · 0 评论 -
前后端分离项目解决跨域问题
前后端分离项目解决跨域问题前言关于跨域前后端跨域问题方法一方法二注意图片跨域问题前言作为前后端分离的项目,经常会遇到跨域问题,例如下面这样的因为使用vue启动的前端项目运行在 9528端口,而后台项目运行在8601端口,这样因为不同端口的原因就造成了跨域请求。同时及时在相同的域名或者端口上,也有可能会遇到跨域问题,例如下面这个这是是因为在请求图片的时候遇到的一个跨域问题,但是这个图片只有在使用nginx静态代理到服务器上的图片时才会遇到,如果使用的是七牛云图片则不会出现问题。问题具体的场景是在原创 2021-01-21 17:06:06 · 469 阅读 · 0 评论 -
ThreadLocal的理解(二)
ThreadLocal的理解(二)ThreadLocalMap源码分析基本结构成员变量存储结构 - Entry弱引用和内存泄漏内存泄漏相关概念弱引用相关概念如果key使用强引用,那么会出现内存泄漏?如果key使用弱引用,那么会出现内存泄漏?出现内存泄漏的真实原因为什么要使用弱引用?Hash冲突的解决ThreadLocal使用场景源码使用场景用户使用场景1用户使用场景2ThreadLocalMap源码分析在分析ThreadLocal方法的时候,我们了解到ThreadLocal的操作实际上是围绕Thread原创 2021-01-19 17:40:47 · 92 阅读 · 0 评论 -
ThreadLocal的理解(一)
@TOCThreadLocal介绍从Java官方文档中的描述:ThreadLocal类用来提供线程内部的局部变量。这种变量在多线程环境下访问(通过get和set方法访问)时能保证各个线程的变量相对独立于其他线程内的变量。ThreadLocal实例通常来说都是private static类型的,用于关联线程和线程上下文。我们可以得知ThreadLocal的作用是:提供线程内的局部变量,不同的线程之间不会相互干扰,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或组件之间一些公共变量传递的复杂度原创 2021-01-19 17:12:25 · 125 阅读 · 0 评论 -
JVM类加载机制
JVM类加载机制类加载器启动类加载器扩展类加载器应用程序类加载器类加载过程加载验证准备解析符号引用直接引用初始化类加载器虚拟机设计团队把加载动作放到JVM外部实现,以便于引用程序决定如何获取所需的类,JVM提供了三种类加载器启动类加载器Bootstrap ClassLoader,负责加载JAVA_HOME\lib目录中的,或通过-Xbootclasspath 参数指定路径下的,且被虚拟机认可(按文件名识别,如tr.jar)的类扩展类加载器Extension ClassLoader,负责加载JAV原创 2021-01-19 16:48:17 · 61 阅读 · 0 评论 -
类的加载与ClassLoader的理解
类的加载与ClassLoader的理解Java内存分析类的加载与ClassLoader的理解类加载过程类加载步骤什么时候发生类初始化类加载器的作用获取运行时候类的完整结构Java内存分析堆存放new的对象和数组可以被所有的线程共享,不会存放别的对象引用栈存放基本变量(会包含这个基本类型的具体数值)引用对象的变量(会存放这个引用在对堆里面的具体地址)方法区可以被所有线程共享包含了所有的class和static变量类的加载与ClassLoader的理解类加载过程当程序主动使用某个类时,原创 2021-01-19 16:40:56 · 156 阅读 · 0 评论 -
Java反射
Java反射反射机制动态语言与静态语言Java反射机制概述什么是反射反射的应用Java反射的优缺点反射相关的主要API理解Class类并获取Class实例Class类Class类常用的方法获取对象实例的方法有了Class对象,我们能够做什么?通过调用Class对象的newInstance()方法 创建类的对象通过Constructor实例化对象Invoke方法setAccessible方法反射性能对比反射操作泛型反射操作注解反射机制动态语言与静态语言动态语言动态语言是一类在运行时可以改变其结构的语言原创 2021-01-19 16:32:18 · 86 阅读 · 0 评论 -
Java注解
Java注解什么是注解Annotation是JDK5.0开始引入的新技术内置注解元注解自定义注解什么是注解Annotation是JDK5.0开始引入的新技术Annotation的作用不是程序本身,可以对程序做出解释(这一点和注释没有什么区别)可以被其它程序,比如编译器读取Annotation的格式注解以 @注释名 在代码中存在的,还可以添加一些参数值例如:@SuppressWarnings(value = "unchecked")Annotation在那里使用?可以附加在pac原创 2021-01-19 16:07:28 · 86 阅读 · 0 评论 -
Java中的双亲委派机制以及如何打破
双亲委派机制以及如何打破什么是双亲委派机制工作原理Java类加载器双亲委派机制举例沙箱机制双亲委派机制的优势为什么要打破双亲委派机制?Tomcat为什么要打破双亲委派机制Tomcat使用Java默认加载器的问题Tomcat的类加载机制工作原理Tomcat应用的默认加载顺序Tomcat类加载过程Tomcat打破双亲委派Tomcat第一部分自定义类加载器(黄色部分)Tomcat第二部分自定义类加载器(绿色部分)举例什么是双亲委派机制当一个类收到了类的加载请求,他首先不会尝试自己去加载这个类,而是把这个请求委原创 2021-01-19 15:54:08 · 604 阅读 · 0 评论