juc之CountDownLatch
CountDownLatch是什么?CountDownLatch 是一种同步辅助工具,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。通过指定 count 来初始化 CountDownLatch,await()方法将阻塞直到线程使用 countDown() 方法减少count 直至为0时释放 所有等待的线程,以及被阻塞的方法将被立即返回。另外, CountDownLatch 的 count 无法被重置。 如果需要重置 count, 可使用 CyclicBarrier。
CountDownLatch 使用场景场景一: 某个线程等待N个线程执行完成后执行
count=N:一个线程等待 其余N个线程完成操作,或者一个线程完成N次操作。
CountDownLatch 初始值为N
等待的线程执行 await 操作,使得当前线程被阻塞(使用LockSupport阻塞) [这里也可以在main中阻塞]
每个线程执行完毕后,调用countDown()
当计数器值变为0,被阻塞的县城会被唤醒,执行待执行的动作。
12345678910111213141516import j ...
spring之springsecurity
spring security 的作用spring security 框架提供了 认证, 授权和常见攻击防御等功能, 其中认证保支持命令式和响应式(reactive)方式。
spring security 架构spring security 对 servlet的支持是基于 servlet filter的. 下图描述了单个HTTP请求的处理程序的典型分层。
FilterChain客户端发送请求给应用时,容器会创建 filterchain 实例 其中包含 filter 实例 和 servlet。其中 servlet 基于请求 URI 处理 httpservletrequest。 在spring mvc 中, servlet是dispatchServlet实例。 servlet 负责处理单个 httpservletrequest 和 httpservletresponse。上图中的每一个filter都提供如下功能。
防止下游的 filter 或者 servlet 被调用。此时 filter 会 写 httpservletrequest。
修改 httpservletrequest 和 ht ...
juc之synchronized、Lock和volatile
问题
为什么 synchronized 编译后 存在一个 monitorenter 和两个 monitorExit?
什么是 happens-before ?
引言,描述 为什么会有并发问题?可见性、有序性、原子性?
本篇将讲述 java 中的并发关键字: synchronized 、 volidate 、 final
在构造器上添加 synchronized 无意义且会报错,因为线程调用构造器创建对象需要权限。
synchronizedsynchronized 如何保障线程安全?12345678910package com.example.securityPlus.juc;public class SynchronizedDemo2 { Object object = new Object(); public void method1() { synchronized (object) { } }}
执行 javac 编译得到 class 文件。再使用 javap -c xx. ...
java之注解
引言
什么是注解?有哪些必要知识?
内置注解?
元注解?
注解的使用场景
注意事项
java.lang.annotation.Annotation中有说明:这是所有注解类型必须继承的公共接口。
以java中提供的@Override注解为例,一个由Override标识的方法声明意为着它将重写父类中中的方法声明。
1234@Target(ElementType.METHOD)@Retention(RetentionPolicy.SOURCE)public @interface Override {}
等价于
1public interface Override extends Annotation{}
元注解什么是元注解?『它是用于修饰注解的注解,通常用在注解的定义上。例如上面Override注解上的@Target和@Retention。java 5中定义了如下四种元注解:
@Target: 定义了注解的作用目标
@Retention:定义注解的生命周期
@Documented: 注解是否应当被保留在JavaDoc中
@Inherited ...
java之异常机制
异常什么是异常?异常是指程序运行过程中出现的错误,一旦错误产生就会创建异常对象,我们需要处理这些异常对象。
异常的体系结构java中,异常对象均派生自Throwable类,java 异常的体系结构如下
Throwable有两个子类,分别为为 Error(错误) 和 Exception(异常)
Error: 表示程序中无法处理的错误,表示运行应用程序中出现了严重的错误。此类错误一般表示代码运行时JVM出现问题。当此类错误发生时,应用不应该去处理此类错误。常见的错误有:Virtual MachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)、OutOfMemoryError。此类错误发生时,JVM将终止线程。非代码性错误。
Exception:是程序本身可以捕获并且可以处理的异常。其中可分为运行时异常(RuntimeException)和非运行时异常,也叫做受检异常
运行时异常(不受检异常): RuntimeException类及其子类表示JVM在运行期间可能出现的错误。编译器不会检查此类异常,并且不要求处理异常,比如用空值对象的引用(NullP ...
java之反射
java反射首先要知道RTTI(run-time type identification),即运行时类型识别,用于在运行时识别一个对象的类型和类信息。不同于编译期间就能确定的对象类型及类信息,java反射允许开发者在运行时发现和使用类的信息。在运行时,通过类的全限定名,可以构造出制定对象,可以调用该对象的任意属性和方法。java的反射机制主要提供以下功能:
运行时判断任意一个对象所属的类
运行时构造任意一个类对象
在运行时判断任意一个类所具有的成员变量和方法
在运行时调用任意一个对象的方法
反射基础在开始讲述java反射之前,先来看一下Class类。
1. Class 类Class 类位于java.lang中。该类的实例表示java应用运行时的类或者接口。运行时每个类对象在jvm里的表示都是一个Class对象。可以通过类名.class、类型.getClass、Class.forName('类全限定名')等方法获取Class对象。另外数组也被映射为class对象的一个类,所有具有相同元素类型和维度的数组都共享该class对象。基本类型boolean、byte、char ...
java之SPI
java类的生命周期和加载过程java类加载机制和类加载器java之双亲委派机制
SPI什么是SPI服务提供接口(SPI,Service Provider Interface) 是 JDK 内置的一种「服务提供发现机制」,是 Java 提供的一套用来被第三方实现或者扩展的 API,它可以用来启用框架扩展和替换组件(可通过 SPI 机制实现模块化)。SPI 的整体机制图如下:
由服务的提供者提供接口的具体实现,然后在classpath下的META-INF/services目录下创建一个以服务接口命名的文件,文件中的内容则是 服务提供者实现累的全限定类名。 其他服务需要使用时,通过查找这个jar包的META-INF/services中的配置文件,根据文件中的具体实现类名,加载该类并实例化。JDK中默认的查找服务所使用的的工具类是java.util.ServiceLoader。
如何使用SPI先来看一个例子,项目结构如下:
定义接口定义接口: mqray.learn.cn.service.Search
123public interface Search { Li ...
java之双亲委派机制
什么是双亲委派机制jvm对class文件采用的是按需加载的方式,当需要该类时才会将它的class文件加载到内存中。加载时采用的是双亲委派机制,即将请求交给父类处理的任务委派模式。双亲委派机制的原理图如下:
双亲委派机制的原理
类加载器收到类加载请求,先检查是否有父类加载器,若有,则将请求委托给父类加载器加载。
如果父类还有父类,则继续向上委托,直至 引导/启动类加载器 Bootstrap ClassLoader。
如果父加载器可以完成加载,则返回成功结果。否则,由子类自行加载。如果子类加载失败则会抛出ClassNotFoundException。加过过程图解如下:对应源码如下:123456789101112131415161718192021222324252627282930313233343536373839404142public abstract class ClassLoader { protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoun ...
docker之初探
编写dockerfile12345678910111213141516171819202122#1.指定基础镜像,并且必须是第一条指令FROM centos:7#3.在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录WORKDIR /usr/java/openjdk-11/bin#4.一个复制命令,把jdk安装文件复制到镜像中,语法:ADD <src>... <dest>,注意:jdk*.tar.gz使用的是相对路径ADD openlogic-openjdk-11.0.21+9-linux-x64.tar.gz /usr/java/openjdk-11/bin#5.设置时区RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeRUN echo 'Asia/Shanghai' >/etc/timezone#6.配置环境变量ENV JAVA_HOME=/usr/java/openjdk-11/bin/openlogic-openjdk-11 ...
java之jvm日志分析及参数解释
k8s 服务质量 和 jvm参数的关系
本文使用的jdk版本为 jdk11
在Java 8及以上版本中,元空间被分配在非堆中的方法区中。因此,元空间和非堆之间的关系是,元空间是非堆中的一个子区域,用于存储类元数据。同时,非堆中还包括其他的内存区域,如方法区、虚拟机栈、本地方法栈等。
jvm配置查看所有JVM配置的默认值1java -XX:+PrintFlagsFinal -version
默认堆大小
-verbose:gc -XX:+PrintGCDetails -Xlog:gc*:stdout:time -XX:+UseConcMarkSweepGC-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof
1-verbose:gc -XX:+PrintGCDetails -Xlog:gc*:stdout:time
查看jvm使用的配置 *java -XX:+PrintCommandLineFlags -version
1234567-XX:Initi ...