
java
you&ok
这个作者很懒,什么都没留下…
展开
-
get和post 请求乱码问题
post: 在web.xml中加入:<filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>enco...原创 2020-10-10 17:05:39 · 214 阅读 · 0 评论 -
Filter
FilterFilter是拦截Request请求的对象,在用户的请求访问的资源前处理ServletRequest以及ServletResponse。可通过xml和注解进行配置,当某个资源被多个Filter所使用到,只能通过xml来配置,触发顺序。当Servlet容器每次处理Filter相关的资源时,都会调用该Filter实例的doFilter方法:Void doFilter(ServletRequest request, ServletResponse response, FilterChai原创 2020-09-21 11:01:37 · 82 阅读 · 0 评论 -
浅谈sleep、wait、yield、join区别
sleep sleep 方法是属于 Thread 类中的,sleep 过程中线程不会释放锁,只会阻塞线程,让出cpu给其他线程,但是他的监控状态依然保持着,当指定的时间到了又会自动恢复运行状态,可中断,sleep 给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会wait wait 方法是属于 Object 类中的,wait 过程中线程会释放对象锁,只有当其他线程调用 notify 才能唤醒此线程。wait 使用时必须先获取对象锁,即必须在 synchronized 修饰的代码块原创 2020-09-14 18:47:40 · 215 阅读 · 0 评论 -
ThreadLocal
并发容器之ThreadLocal详解 ThreadLocal 是什么?有哪些使用场景? ThreadLocal 是一个本地线程副本变量工具类,在每个线程中都创建了一个 ThreadLocalMap 对象,简单说 ThreadLocal 就是一种以空间换时间的做法,每个线程可以访问自己内部 ThreadLocalMap 对象内的 value。通过这种方式,避免资源在多线程间共享。原理:线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。Java提供ThreadLocal类来支持线程局原创 2020-09-14 18:44:56 · 89 阅读 · 0 评论 -
Java8新特性
Java8新特性https://www.jianshu.com/p/0bf8fe0f153b 函数式接口 : 有且仅有一个抽象方法,但是可以有多个非抽象方法(静态方法、default方法)的接口,函数式接口可以被隐式转换为lambda表达式。 可以通过在接口上加上@FunctionalInterface 来显示声明这是个函数式接口,这样你多写一个抽象方法的时候,会在编写的时候就开始报错 而当接口中重写了object中的方法,但没有写实现,这个抽象方法不算入有且仅有一个抽象方法里面,比如: @F原创 2020-09-14 18:37:29 · 71 阅读 · 0 评论 -
CopyOnWriteArrayList
并发容器之CopyOnWriteArrayList详解 CopyOnWriteArrayList 是什么,可以用于什么应用场景?有哪些优缺点? CopyOnWriteArrayList 是一个并发容器。有很多人称它是线程安全的,我认为这句话不严谨,缺少一个前提条件,那就是非复合场景下操作它是线程安全的。CopyOnWriteArrayList(免锁容器)的好处之一是当多个迭代器同时遍历和修改这个列表时,不会抛出 ConcurrentModificationException。在CopyOnWriteAr原创 2020-09-14 18:23:20 · 209 阅读 · 0 评论 -
Java异常分类
基本概念java.lang.Throwable是所有异常的根java.lang.Error是错误信息java.lang.Exception是异常信息2 Exception一般分为Checked异常和Runtime异常,所有RuntimeException类及其子类的实例被称为Runtime异常,不属于该范畴的异常则被称为CheckedException。2.1 Checked异常我们比较熟悉的Checked异常有Java.lang.ClassNotFoundExce.原创 2020-09-14 18:07:14 · 177 阅读 · 0 评论 -
hashcode 与 equals
1.使用hashcode方法提前校验,可以避免每一次比对都调用equals方法,提高效率2.保证是同一个对象,如果重写了equals方法,而没有重写hashcode方法,会出现equals相等的对象,hashcode不相等的情况,重写hashcode方法就是为了避免这种情况的出现。 两个obj,如果equals()相等,hashCode()一定相等。 两个obj,如果hashCode()相等,equals()不一定相等(Hash散列值有冲突的情况,虽然概率很低)。hashcode().原创 2020-09-14 17:58:28 · 185 阅读 · 0 评论 -
Java动态代理
Java动态代理Java动态代理只能针对接口进行动态代理。如果需要对类进行实现代理可以使用:CGLIB,ASM等相关的操作字节码实现。(ASM是一套JAVA字节码生成架构,能够动态生成.class文件并在加载进内存之前进行修改。)动态代理与静态代理的区别: (1)Proxy类的代码被固定下来,不会因为业务的逐渐庞大而庞大;为什么需要动态代理呢,因为静态代理有一个最大的缺陷:接口与代理类是1对1的,有多个接口需要代理,就需要新建多个代理类,繁琐。 (2)可以实现AOP编程,这是静态代理无法实现的; (原创 2020-09-14 16:48:01 · 96 阅读 · 0 评论 -
java IO(BIO)、NIO、AIO
Java IO与NIO的区别IO NIO 面向流 面向缓冲 阻塞IO 非阻塞IO 无 选择器 io(BIO(Blocking I/O,阻塞IO))的各种流是阻塞的,就是当一个线程调用读写方法时,该线程会被阻塞,直到读写完,在这期间该线程不能干其他事,CPU转而去处理其他线程,假如一个线程监听一个端口,一天只会有几次请求进来,但是CPU却不得不为该线程不断的做上下文切换,并且大部分切换以阻塞告终。Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,原创 2020-09-14 09:48:15 · 195 阅读 · 0 评论 -
java原子变量 java.util.concurrent.atomic
AtomicInteger; AtomicLong; AtomicReference; AtomicBoolean;基于CAS原语实现 ,比较并交换、加载链接/条件存储,最坏的情况下是旋转锁支持并发的第一个处理器提供原子的测试并设置操作,通常在单位上运行这项操作。现在的处理器(包括 Intel 和 Sparc 处理器)使用的最通用的方法是实现名为 比较并转换或 CAS 的原语。(在 Intel 处理器中,比较并交换通过指令的 cmpxchg 系列实现。PowerPC 处理器有一对名为“加载并保留”和“条原创 2020-09-11 09:53:23 · 267 阅读 · 0 评论 -
代码会重排序 as-if-serial规则和happens-before规则
在执行程序时,为了提供性能,处理器和编译器常常会对指令进行重排序,但是不能随意重排序,不是你想怎么排序就怎么排序,它需要满足以下两个条件: 在单线程环境下不能改变程序运行的结果; 存在数据依赖关系的不允许重排序 需要注意的是:重排序不会影响单线程环境的执行结果,但是会破坏多线程的执行语义。as-if-serial规则和happens-before规则的区别 as-if-serial语义保证单线程内程序的执行结果不被改变,happens-before关系保证正确同步的多线程程序的执行结原创 2020-09-10 14:49:26 · 326 阅读 · 0 评论 -
多线程锁的升级原理
在使用 synchronized 来同步代码块的时候,经编译后,会在代码块的起始位置插入 monitorenter指令,在结束或异常处插入 monitorexit指令。当执行到 monitorenter 指令时,将会尝试获取对象所对应的 monitor 的所有权,即尝试获得对象的锁。而 synchronized 用的锁是存放在 Java对象头 中的。所以引出了两个关键词:“Java 对象头” 和 “Monitor”。1、Java 对象头我们以 Hotspot 虚拟机为例,Hotspot 的对象头原创 2020-09-09 20:22:28 · 1256 阅读 · 0 评论 -
Java中的并发工具CountDownLatch、CyclicBarrier、Semapphore使用详解
Java中的并发工具CountDownLatch、CyclicBarrier、Semapphore使用详解在JDK的并发包里面提供了几个非常有用的并发工具,CountDownLatch、CyclicBarrier、Semaphore工具类提供了一种并发控制流程的手段。一、CountDownLatchCountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它运行一个或者多个线程一直处于等待状态。 CountDownLatch中有两个关键的方法public voi转载 2020-09-09 19:42:49 · 160 阅读 · 0 评论 -
ThreadLocal
Threadlocal底层是通过threadlocalMap进行存储键值 每个ThreadLocal类创建一个Map,然后用线程的ID作为Map的key,实例对象作为Map的value,这样就能达到各个线程的值隔离的效果。 ThreadLocal的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。 谁设置谁负责移除。总结一下,个人认为使用ThreadLocal的场景最好满足两个条件: 一是该对象不需要在多线程之间共享;原创 2020-09-09 18:23:09 · 223 阅读 · 0 评论 -
进程和线程、线程安全
进程和线程一个程序就是一个进程,而一个程序中的多个任务则被称为线程。进程是表示资源分配的基本单位,线程是进程中执行运算的最小单位,亦是调度运行的基本单位。实现多线程编程的方式有两种,一种是继承 Thread 类,另一种是实现 Runnable 接口。使用继承 Thread 类创建线程,最大的局限就是不能多继承,所以为了支持多继承,完全可以实现 Runnable 接口的方式。需要说明的是,这两种方式在工作时的性质都是一样的,没有本质的区别。虽然系统是把资源分给进程,但是CPU很特殊,是被分配到原创 2020-09-09 17:13:52 · 655 阅读 · 0 评论 -
java关键字synchronized
Synchronized的基本使用Synchronized 原理 如果对上面的执行结果还有疑问,也先不用急,我们先来了解Synchronized的原理,再回头上面的问题就一目了然了。我们先通过反编译下面的代码来看看Synchronized是如何实现对代码块进行同步的:package com.paddx.test.concurrent;public class SynchronizedDemo { public void method() { synchroniz...原创 2020-09-03 17:19:35 · 157 阅读 · 0 评论 -
锁无关数据结构 -- AtomicReference
基于jdk提供的原子类原语实现,例如AtomicReference锁无关(Lock free)算法,顾名思义,即不牵涉锁的使用。这类算法可以在不使用锁的情况下同步各个线程。对比基于锁的多线程设计,锁无关算法有以下优势: 对死锁、优先级倒置等问题免疫:它属于非阻塞性同步,因为它不使用锁来协调各个线程,所以对死锁、优先级倒置等由锁引起的问题免疫;原语 Compare-and-swap (CAS) ,Herlihy 证明了 CAS 是实现锁无关数据结构的通用原语, CAS 可以原子地比较一个内存位置的内容原创 2020-09-03 16:57:52 · 214 阅读 · 0 评论 -
自旋锁、阻塞锁、可重入锁、悲观锁、乐观锁等
各种锁1、自旋锁 自旋锁可以使线程在没有取得锁的时候,不被挂起,而转去执行一个空循环,(即所谓的自旋,就是自己执行空循环),若在若干个空循环后,线程如果可以获得锁,则继续执行。若线程依然不能获得锁,才会被挂起。 使用自旋锁后,线程被挂起的几率相对减少,线程执行的连贯性相对加强。因此,对于那些锁竞争不是很激烈,锁占用时间很短的并发线程,具有一定的积极意义,但对于锁竞争激烈,单线程锁占用很长时间的并发程序,自旋锁在自旋等待后,往往毅然无法获得对应的锁,不仅仅白白浪费了CPU时间,最终还是免不了被挂起的操作原创 2020-09-03 16:22:37 · 447 阅读 · 1 评论 -
CAS操作
CAS,(Compare and Swap)CAS的思想很简单:三个参数,一个当前内存值V、旧的预期值A、即将更新的值B,当且仅当预期值A和内存值V相同时,将内存值修改为B并返回true,否则什么都不做,并返回false。 JVM中的CAS操作正是利用了提到的处理器提供的CMPXCHG指令实现的;循环CAS实现的基本思路就是循环进行CAS操作直到成功为止;先来看看CAS在atomic类中的应用 public final native boolean compareAndSwapObjec..原创 2020-09-03 11:22:52 · 291 阅读 · 0 评论 -
java操作的原子性i++
i++不是原子操作,也就是说,它不是单独一条指令,而是3条指令:1、从内存中把i的值取出来放到CPU的寄存器中2、CPU寄存器的值+13、把CPU寄存器的值写回内存原创 2020-09-03 11:08:51 · 499 阅读 · 0 评论 -
内存屏障 与 volatile
java并发采用的是共享内存模型,线程之间的通信对程序员来说是透明的,内存可见性问题很容易困扰着java程序员。什么是 Memory Barrier(内存屏障)?内存屏障,又称内存栅栏,是一个CPU指令,基本上它是一条这样的指令: 1、保证特定操作的执行顺序。 2、影响某些数据(或则是某条指令的执行结果)的内存可见性。编译器和CPU能够重排序指令,保证最终相同的结果,尝试优化性能。插入一条Memory Barrier会告诉编译器和CPU:不管什么指令都不能和这条Memory Barrier指原创 2020-09-03 11:03:20 · 190 阅读 · 0 评论 -
ClassLoader.loadClass()与Class.forName()的区别
Class.forName(className)方法,其实调用的方法是Class.forName(className,true,classloader);注意看第2个boolean参数,它表示的意思,在loadClass后必须初始化。比较下我们前面准备jvm加载类的知识,我们可以清晰的看到在执行过此方法后,目标对象的 static块代码已经被执行,static参数也已经被初始化。再看ClassLoader.loadClass(className)方法,其实他调用的方法是ClassLoader.loadC原创 2020-09-02 19:04:49 · 210 阅读 · 0 评论 -
java反射
Java反射是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法原创 2020-09-02 18:48:48 · 96 阅读 · 0 评论 -
java类加载
类的加载过程类的加载类的加载 又称为 类的初始化,实际上可细分为 类的 加载、连接、初始化。下面将讲述着三个阶段的过程!类的加载 指.class文件读入内存,并为之创建一个 java.lang.Class对象。类加载指的是将class文件读入内存,并为之创建一个java.lang.Class对象,即程序中使用任何类时,系统都会为之建立一个java.lang.Class对象,系统中所有的类都是java.lang.Class的实例。类加载,是通过类加载器来完成的,类加载器通常由JVM提.原创 2020-09-02 16:28:17 · 142 阅读 · 0 评论 -
java重排序
在执行程序时为了提高性能,编译器和处理器常常会对指令做重排序。重排序分三种类型: 编译器优化的重排序。 编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。 指令级并行的重排序。 现代处理器采用了指令级并行技术(Instruction-Level Parallelism, ILP)来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。 内存系统的重排序。 由于处理器使用缓存和读/写缓冲区,这使得加载和存储操作看上去可能是在乱原创 2020-08-27 19:46:19 · 1570 阅读 · 0 评论 -
jvm调优
jvm调优2.1 优化目标优化jvm其实是为了满足高吞吐,低延迟需求来优化GC,之前遇到的情况中,其实不优化GC也是可以正常运行的,只不过偶尔会因为高并发给压垮,但是也可以通过其他方式来解决这个问题。2.2 优化GC步骤 首先需要观察目前垃圾回收的情况,分析出老年代和年轻代回收的情况,适当的去调整内存大小和-XX:SurvivorRatio的比例。 根据垃圾收集器的特性,选择适合自己业务的垃圾收集器,一般来说现在的WEB服务都是CMS+ParNew收集器。根据CMS收集器一般来说转载 2020-08-27 19:22:52 · 110 阅读 · 0 评论 -
内存泄漏
内存泄露是指分配出去的内存没有被回收回来,由于失去了对该内存区域的控制,因而造成了资源的浪费。Java 中一般不会产生内存泄露,因为有垃圾回收器自动回收垃圾,但这也不绝对,当我们 new 了对象,并保存了其引用,但是后面一直没用它,而垃圾回收器又不会去回收它,这边会造成内存泄露,内存溢出是指程序所需要的内存超出了系统所能分配的内存(包括动态扩展)的上限。内存泄漏内存泄漏一般可以理解为系统资源(各方面的资源,堆、栈、线程等)在错误使用的情况下,导致使用完毕的资源无法回收(或没有回收),从而导致新的资源原创 2020-08-27 19:16:29 · 119 阅读 · 0 评论 -
JVM里的GC(Garbage Collection)
JVM里的GC(Garbage Collection)的算法有很多种,如标记清除收集器,压缩收集器,分代收集器等等分代收集器中 JVM把年轻代分为了三部分:1个Eden区和2个Survivor区(分别叫from和to)。默认比例为8:1,为啥默认会是这个比例,接下来我们会聊到。一般情况下,新创建的对象都会被分配到Eden区(一些大对象特殊处理),这些对象经过第一次Minor GC后,如果仍然存活,将会被移到Survivor区。对象在Survivor区中每熬过一次Minor GC,年龄就会增加1岁,当它的原创 2020-08-27 18:55:06 · 128 阅读 · 0 评论