Synchronized 在1.5以前是重量级锁,当遇到synchronzed时,其他线程需要等待并进入blocked状态。 在1.6以后,经过大量的测试发现加锁的地方经常被一个线程访问。所以对synchronized进行了锁的粒度优化,主要在对象头增加标记位因此有了偏向锁、轻量级锁、重量级锁。 三种常用用法Synchronized(A.class), synchronized(变量) synchronized method, 通过代码与bytecode对比发现, synchronized method: 字节码中存在ACC_SYNCHRONIZED这个标记,当执行到这个行是,当前线程需要获取对象monitor锁,然后在进入方法处理...

Spring SpringBoot小的细节总结记录 spring mvc 采用SPI技术,注入Spring的Servlet类,具体是实现了javax.servlet.ServletContainerInitializer接口的SpringServletContainerInitializer类,在这个类上注解@HandlesTypes传递的参数给Servlet中进行扩展使用 Srping boot Servlet3.0中@HandlesTypes会触发WebApplicationInitializer实现类, SpringBootServletInitializer; 实现的WebApplicationInitializer接口的...

限流器 我们项目是新闻类的站点,每天需要限制各种爬虫,保证服务在可承受范围内,需要保护后台服务正常。需要使用限流器。 固定 滑动 令牌桶 一 固定窗口: 当前请求是否在最后一次请求时间点+设置的窗口的时间范围内,然后累计请求次数,判断是否达到上限,如果不在范围会重新初始化请求数(0)并记录当前请求时间为最后一次请求时间。 例如当程序启动的时候设置最后一次请求时间为当前系统是,当有一个请求到来是,判断请求时刻在(最后一次请求时间+固定的窗口是否)之间,如果在之间说明需要判断是否允许请求,即累加当前窗口的次数并判断是否达到最大的请求数 缺点是:时间窗口会承受2倍的请求。比如窗口时间每秒允许10个请求, 当第一秒的后半秒请求了10,在下一...

当前jvm配置 -XX:+PrintFlagsInitial 查看初始 docker JAVA_OPTS 1-XX:+AlwaysPreTouch 2 JAVA进程启动的时候,虽然我们可以为JVM指定合适的内存大小,但是这些内存操作系统并没有真正的分配给JVM,而是等JVM访问这些内存的时候,才真正分配,这样会造成以下问题。 3 1、GC的时候,新生代的对象要晋升到老年代的时候,需要内存,这个时候操作系统才真正分配内存,这样就会加大young gc的停顿时间; 4 2、可能存在内存碎片的问题。 5 6 jvm启用会慢,JDK8版本以前都不是并行处理的,到了JDK9才是并行 7 8 在没有配置-XX:+AlwaysPreTouch参数...

定义自定义注解 1@Retention(RetentionPolicy.RUNTIME) 2@Target(ElementType.PARAMETER) 3public @interface Logined { 4} 注解处理器 1@Component 2@Slf4j 3public class LoginedArgumentResolver implements HandlerMethodArgumentResolver { 4 @Override 5 public boolean supportsParameter(MethodParameter parameter) { 6 return...

Java 基础技能 包括以下大致内容 Object类的常用方法 常用反射方法 常用字段处理 枚举处理 泛型的获取 基本类型的判断 1. isAssignableFrom()与instanceof isAssignableFrom() 描述:判断目标类是否为父类的子类 使用:父类.class.isAssignableFrom(子类.class) instanceof 描述:判断实例是否为父类的子类 描述:(new)实例 instanceof 父类 具体的demo如下 1package cn.linuxcrypt.api.demo; 2 3import lombok.Data; 4import org.junit.Test; 5...

使用一条SQL语句,对产品的库存查询。 产品的表结构 1CREATE TABLE `temp` ( 2 `id` int(11) NOT NULL AUTO_INCREMENT, 3 `product_id` int(11) NOT NULL, 4 `flag` int(1) DEFAULT NULL, 5 `size` int(11) DEFAULT NULL, 6 PRIMARY KEY (`id`) 7) ENGINE=InnoDB DEFAULT CHARSET=utf8; 字段 描述 id 主键 product_id 产品唯一标识 flag 标记位,1代表入库;2代表出入 size 数量 使用一条sql语句查询每个产品的...

一、Java基础类型 名字 默认值 占用空间 最大值 最小值 byte 0 8位 127(2^7-1) -128(-2^7) chat ‘u0000’ 16 位 Unicode 字符 \uffff (65535) \u0000 (0) boolean false 1位 - - short 0 16位 32767(2^15 - 1) -32768(-2^15) int 0 32 位 2,147,483,647(2^31 - 1) -2,147,483,648(-2^31) float 0.0f 32位 - - long 0L 64 位 9,223,372,036,854,775,807(2^63 -1)...

调用时机 clinit在jvm第一次加载class时调用,init在实例创建出来的时候调用 clinit在jvm第一次加载class文件时调用,包括静态变量初始化语句和静态块的执行 init在实例创建出来的时候调用,包括调用new操作符;调用Class或java.lang.reflect.Constructor对象的newInstance()方法;调用任何现有对象的clone()方法;通过java.io.ObjectInputStream类的getObject()方法反序列化。 详情 clinit方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static)中的语句合并产生的,编译器收集的顺序是由语句在源文件中出现的顺...

Java的内存优化之Reference,SoftReference、WeakReference、StrongReference 引用对象类型定义 首先,引用对象在Java定义中有三种类型,从弱到强依次为:软引用、弱引用与虚引用,三种级别也各有所不同(软引用>弱引用)。本文浅析下软引用与弱引用。大概的解释,软引用适合应用在需要cache的场景,一般面向实现内存敏感的缓存;弱引用则是适用在某些场景为了无法防止被回收的规范性映射,它优先级最低,一般与引用队列联合使用。 详情 强引用(默认存在) 强引用,是在实际开发中最为普遍的引用。有时候你开发的时候,申请一个内存空间的时候,就已经是强引用了。例如: 1Object obj = new...

HttpClient 工具类 1package cn.linuxcrypt.utils; 2 3import org.apache.http.*; 4import org.apache.http.client.ClientProtocolException; 5import org.apache.http.client.ResponseHandler; 6import org.apache.http.client.config.CookieSpecs; 7import org.apache.http.client.config.RequestConfig; 8import...

概述 Deque是Queue的子接口,我们知道Queue是一种队列形式,而Deque则是双向队列,它支持从两个端点方向检索和插入元素,因此Deque既可以支持LIFO形式也可以支持LIFO形式.Deque接口是一种比Stack和Vector更为丰富的抽象数据形式,因为它同时实现了以上两者 ArrayDeque实现了Deque的接口以及上图其他的接口,因此ArrayDeque支持序列化、克隆、迭代器操作、队列特性并且扩展了AbstractCollection抽象类 应用场景 linkedList内部实现用node节点链接前后元素。模拟c/c++的链表(长处在于中间节点的增删操作为o(1))。 vector方法加...

Java 8中的常用函数式接口 函数式接口 函数描述符 原始类型特化 Predicate T->boolean IntPredicate, LongPredicate, DoublePredicate Consumer T->void IntConsumer,LongConsumer, DoubleConsumer Function<T,R> T->R IntFunction, IntToDoubleFunction, IntToLongFunction, LongFunction, LongToDoubleFunction, LongToIntFunction, DoubleFunction, ToIntFunction,...

Java 类的加载机制

大致流程: 读取.class文件二进制文件–>验证与解析(格式 关键字 关键词 语法 引用 类型转化等等) –> 初始化 –> 使用 –> 卸载

我们都知道普通的事务中有原子性,一致性,隔离性,持久性。而分布式事务中也有这些属性。 分布式事务 随着分布式计算的发展,事务在分布式中也得到了广泛的应用。 在单机数据库中,我们很容易能够实现满足ACID特性的事务处理系统,但在分布式数据库中,数据分散在各个不同的机器上,如何对这些数据进行分布式的事务处理具有非常大的挑战。 分布式中会有机器宕机和各种网络异常。尽管存在这种种分布式问题,但是在分布式计算领域,为了保证分布式应用程序的可靠性,分布式事务是无法回避的。 分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于分布式系统的不同节点上。 通常一个分布式事务中会涉及对多个数据源或业务系统的操作。 我们可以设...

CAS(Compare and Swap) 是利用底层硬件平台特性,实现原子性操作的算法,Java 1.5 以后 JUC(java.util.concurrent) 实现主要以此为基础;找了不少资料以下记录一下个人对于 CAS 的理解(部分资料 copy 的) 一、CAS 简述 从最基础的 Java 中的 i++ 操作来说,i++ 并非原子操作,实质上相当于先读取 i 值,然后在内存中创建缓存变量保存 ++ 后结果,最后写会变量 i;而在这期间 i 变量都可能被其他线程读或写,从而造成线程安全性问题 CAS 算法大致原理是:在对变量进行计算之前(如 ++ 操作),首先读取原变量值,称为 旧的预期值 A,然后在更新之前再获取当前内存...

一、概念和特征 直接内存并非 JVMS 定义的标准 Java 运行时内存。 JDK1.4 加入了新的 NIO 机制,目的是防止 Java 堆 和 Native 堆之间往复的数据复制带来的性能损耗,此后 NIO 可以使用 Native 的方式直接在 Native 堆分配内存。 直接内存区域是全局共享的内存区域。 直接内存区域可以进行自动内存管理(GC),但机制并不完善。 本机的 Native 堆(直接内存) 不受 JVM 堆内存大小限制。 可能出现 OutOfMemoryError 异常。 二、异常演示 测试代码: 1 2public class TestNativeHeap { 3 4 /** 5 * VM Args:...