Java
文章平均质量分 75
AndysCat
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
《JVM学习系列》一.Java运行时内存区域介绍.md
1.程序计数器程序计数器是一块小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。每一个线程都有自己程序计数器。如果线程正在执行的是一个Java方法,程序计数器的值就是正在执行的虚拟机字节码指令的地址;如果线程正在执行的是Native方法,这个程序计数器的值为空(undefined)。此内存区域是虚拟机规范中没有规定任何OutOfMemoryError情况的区域。2.虚拟机栈虚拟机栈描述的是原创 2016-10-28 17:11:04 · 399 阅读 · 0 评论 -
AtomicInteger的实现原理.md
1.基本AtomicInteger是对Integer类型的一个包装,提供原子性的访问和更新操作。其原子性的操作是基于CAS实现的。CAS的过程是这样,执行运算时,使用当前数据值作为判断条件,利用CAS指令视图进行更新。更新之前获取内存中的最新值,与传来的当前值作比较。如果数值没有变,则说明没有其他线程进行并发修改,更新操作成功。则否则要么进行重试,要么返回结果。2.AtomaticInteg...原创 2018-12-11 20:01:05 · 1606 阅读 · 0 评论 -
Spring的JmsTemplate发送消息生成连接过多问题.md
我在使用SpringCloud框架重构我司的采集适配器时,使用的消息中间件有两个,一个是kafka,接收处理网关上报的原始数据。通过采集器的数据处理器之后,封装成为平台对象,发送到ActiveMq,进入平台业务系统。ActiveMq生产的功能,就简单使用Spring提供的jmsTemplate。但是在测试时发现了个问题。有天发现activeMq有些异常。问题描述:当采集器短时间内发送大量消息(...原创 2018-12-11 21:00:09 · 2563 阅读 · 0 评论 -
JVM内存模型——堆及垃圾回收.md
本节简单梳理下JVM运行时堆上的内存模型,以及垃圾回收的的知识点。堆是JVM运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。对象的堆内存由称为垃圾回收器的自动内存管理系统回收。非堆内存Java 虚拟机具有一个由所有线程共享的方法区。方法区属于非堆内存。它存储每个类结构,如运行时常数池、字段和方法数据,以及方法和构造方法的代码。它是在 Java 虚拟机...原创 2019-01-04 15:03:17 · 217 阅读 · 0 评论 -
如何实现自定义注解.md
如果用最简单的话描述注解,那就是元数据,即一种描述数据的数据。所以,可以说注解就是源代码的元数据。在Java中叫Annotation,Annotation是一种应用于类、方法、参数、变量、构造器及包声明中的特殊修饰符。Java自带的注解有@Override,@Supperwarning,@Deprecated1.注解的作用1.生成文档,比如@see @param @return2.在编译...原创 2019-01-24 11:51:46 · 1400 阅读 · 0 评论 -
Java线程池的典型用法.md
Java中线程的出现通常是实现异步处理的功能,我们创建和使用一个线程非常简单,但是有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。为了解决这个问题,线程池就出现了。线程池可以使得线程执行完一个任务之后,不被销毁进而复用,从而避免了频繁创建和销毁线程的资源消耗。Java中线程池对应的...原创 2019-01-24 15:27:52 · 242 阅读 · 0 评论 -
Java 线程池的submit的使用与分析.md
在Java5以后,通过Executor来启动线程比用Thread的start()更好。在新特征中,可以很容易控制线程的启动、执行和关闭过程,还可以很容易使用线程池的特性。我们用的最多的execute方法,0.异步返回值的场景我们先不用线程池,来实现一个功能。加入周末了,几个小伙伴要一块做饭,假设做饭需要3个步骤,分别是:1.打扫厨房卫生,准备厨具2.买菜3.炒菜现在我们怎么分工呢,现实...原创 2019-01-25 19:20:18 · 7139 阅读 · 0 评论 -
token保活设计.md
如果我们要使用token机制用以标识用户登录状态,以获得请求相关资源接口的权限。让你来设计一套方案,以为怎么设计呢?通常有两种思路:1.使用refreshtoken获取新的accesstoken登录成功之后,返回一个返回refreshtoken和accesstoken。accesstoken作为请求其他接口的权限参数,它有时间期限。过期之后就无法使用。可以使用refresh_token来获取...原创 2019-01-15 20:53:14 · 1928 阅读 · 1 评论 -
MongoRepository的findById方法查不出_id值的解决方案.md
搭一个新项目,从mongo数据库中查询数据,我直接使用的spring-data-mongodb模块。直接创建Repository接口,继承MongoRepositorypublic interface ResourceRepository extends MongoRepository<Resource, Long> {}使用MongoRepository的findById方法...原创 2019-01-22 20:37:52 · 12025 阅读 · 7 评论 -
Volatile和“Happens-Before”原则.md
volatile不是Java独有的,C语言也有,它的直接目的就是禁用CPU缓存。使用volatile修饰的变量,它实现的作用是,对于这个变量的读写,不能使用CPU缓存必须从内存中写入或读出。看一个例子,线程A执行writer方法,线程B执行reader方法,那么输出x的值是多少呢:public class VolatileApp { int x = 0; volatile b...原创 2019-03-15 18:45:58 · 448 阅读 · 0 评论 -
volatile的适用场景.md
一般多线程问题涉及到两个特性:原子性和可见性。关键字synchronized举例,如果把代码块声明为 synchronized,有两个重要后果,通常是指该代码具有 原子性(atomicity)和 可见性(visibility)。原子性意味着个时刻,只有一个线程能够执行一段代码,这段代码通过一个monitor object保护。从而防止多个线程在更新共享状态时相互冲突。可见性则更为微妙,它必须...原创 2019-03-12 10:19:18 · 224 阅读 · 0 评论 -
【并发编程系列】1.并发安全问题的源头
0.定义可见性: 一个线程对共享变量的修改,另一个线程能够立刻看到。原子性: 一个或多个操作在CPU执行过程中不被中断,称为原子性。有序性: 程序按照代码的先后顺序执行。导致可见性问题的原因是CPU缓存;导致有序性问题的原因是编译优化。线程切换可能带来原子性问题解决问题的直接方法就是禁用缓存和优化。Java内存模型JVM如何按需禁用缓存和编译优化的方法。具体来说这些方法包括 vo...原创 2019-03-13 19:06:28 · 307 阅读 · 0 评论 -
JVM内存模型——虚拟机栈详细讲解.md
0.JVM运行时数据模型Java 虚拟机的内存模型分为两部分:一部分是线程共享的,包括 Java 堆和方法区;另一部分是线程私有的,包括虚拟机栈和本地方法栈,以及程序计数器这一小部分内存。1.程序计数器和本地方法栈程序计数器和程序计数器比较简单,放在一块讲。1.1 程序计数器是一块小的内存空间,线程私有的。可以看做是当前线程所执行的字节码的行号指示器。每一个线程都有自己程序计数器。如...原创 2018-12-17 17:40:53 · 2958 阅读 · 0 评论 -
Spring事件处理——onApplicationEvent执行两次.md
我们知道Spring有两大类事件,一类是Application事件,超类是SpringApplicationEvent,这类事件是在Spring程序启动时,过程中分为几个阶段,每进行一个阶段,发出一个事件,依次对应ApplicationStartingEvent到ApplicationReadyEvent。标志着Application从启动开始到启动完成,各个阶段的分割点。参考Spring启动过程...原创 2018-12-26 20:44:51 · 13235 阅读 · 5 评论 -
Spring启动过程中Application事件的监听与处理.md
这篇博客是解决一个实际问题,在解决过程中梳理SpringApplicationEvent的运行机制和使用方法。这个问题是,微服务架构下,需要依次启动多个服务,服务之间存在运行时的依赖关系,必须保证多个服务的启动顺序。所以决定从Spring的Application事件入手。1.Application Events and Listeners我查了一些资料,通用的解决方案是:创建一个监听类,实现o...原创 2018-12-26 16:50:49 · 2899 阅读 · 6 评论 -
Java的Object的hashcode函数和equals函数
0.背景hashCode()和equals()定义在Object类中,这个类是所有java类的基类,所以所有的java类都继承这两个方法。1. 使用hashCode()方法被用来获取给定对象的唯一整数。这个整数被用来确定对象被存储在HashTable类似的结构中的位置。默认的,Object类的hashCode()方法返回这个对象存储的内存地址的编号。2. JDK的Javadoc中所说,如果重写equ原创 2016-10-19 15:18:24 · 401 阅读 · 0 评论 -
《JVM学习系列》二.HotSpot虚拟机对象解密
0.背景上篇文章介绍了Java虚拟机的运行时的数据区之后,这篇继续探寻这些虚拟机的其他细节,比如对象是如何创建的、如何布局以及如何访问的。对于这样涉及细节的问题,必须吧讨论限定在具体的虚拟机和集中在某一个内存区域上才有意义。下面一常用的HotSpot虚拟机和常用的内存区域Java堆为例,探讨HotSport虚拟机在Java堆中对象分配、布局和访问的全过程。1.对象的创建虚拟机遇到一条new指令时,会原创 2016-10-31 19:57:19 · 419 阅读 · 0 评论 -
《JVM学习系列》三.HotSpot虚拟机对对象的回收
#0. GC要完成3件事:1. 哪些内存需要回收?2. 什么时候回收?3. 如何回收?Java内存的程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭;栈中的栈帧随着方法的进入和退出而有条不紊地执行着入栈和出栈操作。每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因此这几个区域的内存分配和回收都具备确定性,在这几个区域内就不需要过多考虑回收的问题,因为方法结束或原创 2016-11-01 15:03:27 · 422 阅读 · 0 评论 -
《Spring Security教程系列》一.Spring Security简介
# 1.Spring Security是什么?Spring Security提供了基于Java EE的企业应用软件全面的安全服务.这里特别强调支持使用Spring框架构建的项目,Spring框架是企业软件开发Java EE方案的领导者 .Spring Security 是一个能够为基于 Spring 的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在 Spring 应用上下原创 2016-11-30 11:32:27 · 1290 阅读 · 0 评论 -
《JVM学习系列》四.垃圾收集算法及HotSpot的算法实现
0 说明本篇文章只是介绍几种算法的思想,实现细节不会过多的讨论。1.垃圾收集算法1.1标记-清除算法算法分为标记和清除两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象,它的标记过程就是使用可达性算法进行标记的。主要缺点有两个:效率问题,标记和清除两个过程的效率都不高空间问题,标记清除之后会产生大量不连续的内存碎片1.2复制算法复制算法:将可用内存按照容量分为大小相原创 2016-11-02 19:03:58 · 304 阅读 · 0 评论 -
《Java并发系列》0.并发编程基础
1.线程现代操作系统调度的最小单元是线程,也叫轻量级进程,在一个进程中可以创建多个线程,这些线程都拥有各自的计数器,堆栈和局部变量等属性,并且能够访问共享的内存变量。一个普通的Java程序,运行main函数时可能出现的线程:mian //函数入口Reference Handler //清除Reference的线程Finalizer // 调用对象的finalize方法的线程Si原创 2016-11-15 20:46:08 · 284 阅读 · 0 评论 -
拓展Log4j基本尝试.md
上周老大让我拓展下apache的log4j,让其可以把日志内容当做事件,发送到消息队列当中,然后有专门的事件处理来订阅消息,同时事件处理程序和socket关联在一块。客户端通过socket请求日志信息,请求参数构成规则,来决定是否通过socket连接发送日志到客户端。现在我们把焦点放在“如何在打印日志的时候发消息”,至于事件处理程序暂且不表。我最开始的想法是,将日志内容分为分为4部分:日期,级别,所原创 2017-09-05 23:04:47 · 345 阅读 · 0 评论 -
拓展log4j——在写日志时加入自己的逻辑.md
在理解log4j实现的基础上,用一种聪明的来拓展log4j,实现在写日志的前后可以加入自己的逻辑原创 2017-09-06 11:12:06 · 602 阅读 · 0 评论 -
《Java并发编程的艺术》笔记五——Java线程基础.md
0.线程的状态名称 说明 New 即线程刚刚创建,而并未执行 Runnable 运行状态,Java线程将操作系统中的就绪和运行两种状态笼统的称作“运行中” Blocked 阻塞状态,表示线程阻塞于锁 Waiting 等待状态,表示线程进入等待状态,需要等待其他线程做出一些动作(通知或中断) TimeWaiting 超时等待状态,在指定时间内自行返回 Termicaled 终止状原创 2017-09-03 13:38:30 · 330 阅读 · 0 评论 -
Java类加载器和双亲委派模型.md
0.类加载过程一般来说,类加载分为3个过程,加载,链接和初始化。1.加载阶段,是Java将字节码数据从不同数据源读取到JVM中,并映射为JVM认可的Class对象,这里的数据源可能有Jar包,class文件,甚至网络数据源等。如果输入数据不是ClassFile结构,则会抛出ClassFormatError。2.链接,这是核心步骤,将原始的类定义信息平滑过渡到JVM运行过程中。细分为3个步骤...原创 2018-12-12 17:53:15 · 308 阅读 · 0 评论 -
Beam系列一 Beam介绍及简单使用.md
1.简介简单地说,Apache Beam是一个实时处理、流处理的大数据框架,由Google DataFlow贡献给 Apache 基金会孵化而来。2.应用场景以下为应用场景的几个例子:1.Beam 可以用于 ETL Job 任务Beam 的数据可以通过 SDKs 的 IO 接入,通过管道可以用后面的 Runners 做清洗。2.Beam 数据仓库快速切换、跨仓库由于 Beam 的数据...原创 2018-12-13 19:56:32 · 4953 阅读 · 0 评论 -
【同步-专栏系列】2.利用互斥锁解决原子性问题
原子性的定义:一个或多个操作在CPU的执行过程中,不被中断的特性叫做原子性。我们知道引起原子性问题的原因是“线程切换”。所以如果能够禁止线程切换就解决问题了?而操作系统是依赖CPU中断做线程切换的,那么我们禁用CPU中断不就行了吗?在单核CPU的环境下,这个答案是可行的。但是现在是多核CPU时代。在多核CPU场景下,假如同一时刻有两个线程在运行,一个线程执行在CPU-1上,一个执行在CPU-2...原创 2019-04-01 19:42:20 · 351 阅读 · 0 评论
分享