自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(52)
  • 资源 (6)
  • 收藏
  • 关注

原创 【同步-专栏系列】2.利用互斥锁解决原子性问题

原子性的定义:一个或多个操作在CPU的执行过程中,不被中断的特性叫做原子性。我们知道引起原子性问题的原因是“线程切换”。所以如果能够禁止线程切换就解决问题了?而操作系统是依赖CPU中断做线程切换的,那么我们禁用CPU中断不就行了吗?在单核CPU的环境下,这个答案是可行的。但是现在是多核CPU时代。在多核CPU场景下,假如同一时刻有两个线程在运行,一个线程执行在CPU-1上,一个执行在CPU-2...

2019-04-01 19:42:20 225

原创 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 360

原创 Redis底层数据结构.md

1.Redis 概述Redis 数据库里面的每个键值对(key-value) 都是由对象(object)组成的:数据库键总是一个字符串对象(string object);数据库的值则可以是字符串对象、列表对象(list)、哈希对象(hash)、集合对象(set)、有序集合(sort set)对象这五种对象中的其中一种。2.Redis 底层数据结构有以下数据类型:简单动态字符串(SDS)...

2019-03-14 11:48:12 210

原创 【并发编程系列】1.并发安全问题的源头

0.定义可见性: 一个线程对共享变量的修改,另一个线程能够立刻看到。原子性: 一个或多个操作在CPU执行过程中不被中断,称为原子性。有序性: 程序按照代码的先后顺序执行。导致可见性问题的原因是CPU缓存;导致有序性问题的原因是编译优化。线程切换可能带来原子性问题解决问题的直接方法就是禁用缓存和优化。Java内存模型JVM如何按需禁用缓存和编译优化的方法。具体来说这些方法包括 vo...

2019-03-13 19:06:28 202

原创 volatile的适用场景.md

一般多线程问题涉及到两个特性:原子性和可见性。关键字synchronized举例,如果把代码块声明为 synchronized,有两个重要后果,通常是指该代码具有 原子性(atomicity)和 可见性(visibility)。原子性意味着个时刻,只有一个线程能够执行一段代码,这段代码通过一个monitor object保护。从而防止多个线程在更新共享状态时相互冲突。可见性则更为微妙,它必须...

2019-03-12 10:19:18 140

原创 Java 线程池的submit的使用与分析.md

在Java5以后,通过Executor来启动线程比用Thread的start()更好。在新特征中,可以很容易控制线程的启动、执行和关闭过程,还可以很容易使用线程池的特性。我们用的最多的execute方法,0.异步返回值的场景我们先不用线程池,来实现一个功能。加入周末了,几个小伙伴要一块做饭,假设做饭需要3个步骤,分别是:1.打扫厨房卫生,准备厨具2.买菜3.炒菜现在我们怎么分工呢,现实...

2019-01-25 19:20:18 6895

原创 Java线程池的典型用法.md

Java中线程的出现通常是实现异步处理的功能,我们创建和使用一个线程非常简单,但是有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。为了解决这个问题,线程池就出现了。线程池可以使得线程执行完一个任务之后,不被销毁进而复用,从而避免了频繁创建和销毁线程的资源消耗。Java中线程池对应的...

2019-01-24 15:27:52 171

原创 如何实现自定义注解.md

如果用最简单的话描述注解,那就是元数据,即一种描述数据的数据。所以,可以说注解就是源代码的元数据。在Java中叫Annotation,Annotation是一种应用于类、方法、参数、变量、构造器及包声明中的特殊修饰符。Java自带的注解有@Override,@Supperwarning,@Deprecated1.注解的作用1.生成文档,比如@see @param @return2.在编译...

2019-01-24 11:51:46 1287

原创 MongoRepository的findById方法查不出_id值的解决方案.md

搭一个新项目,从mongo数据库中查询数据,我直接使用的spring-data-mongodb模块。直接创建Repository接口,继承MongoRepositorypublic interface ResourceRepository extends MongoRepository<Resource, Long> {}使用MongoRepository的findById方法...

2019-01-22 20:37:52 11192 7

原创 token保活设计.md

如果我们要使用token机制用以标识用户登录状态,以获得请求相关资源接口的权限。让你来设计一套方案,以为怎么设计呢?通常有两种思路:1.使用refreshtoken获取新的accesstoken登录成功之后,返回一个返回refreshtoken和accesstoken。accesstoken作为请求其他接口的权限参数,它有时间期限。过期之后就无法使用。可以使用refresh_token来获取...

2019-01-15 20:53:14 1556 1

原创 SpringBoot中使用websocket.md

最近有这样一个需求,网关厂家将物联设备接入我司云平台的时候,希望能看到上报设备数据的关键日志,以方便调试。首先想到的就是使用websocket推送。浏览器发起websocket连接,发送订阅消息,然后往这个连接session中推送日志。整个设计流程如下图:1.实现我们设计两个类,一个类命名为WebSocketServer 用来管理websocket连接以及发送消息;另一个类命名为WebS...

2019-01-14 20:02:16 357

原创 Spring中手动开启kafka监听.md

0. 背景重现最近搭建一个新项目,基于SpringBoot框架,使用Kafka做消息中间件。使用@KafkaListener注解来创建一个消费者,实现对Kafka消息的消费。我计划的执行顺序是这样的:服务启动之后,创建Consumer实例,执行loadResourceConfig初始化方法,之后才开始消费Kafka的消息。但是出现了一个问题:没有等loadResourceConfig方式执行...

2019-01-09 20:40:28 4357

原创 JVM内存模型——堆及垃圾回收.md

本节简单梳理下JVM运行时堆上的内存模型,以及垃圾回收的的知识点。堆是JVM运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。对象的堆内存由称为垃圾回收器的自动内存管理系统回收。非堆内存Java 虚拟机具有一个由所有线程共享的方法区。方法区属于非堆内存。它存储每个类结构,如运行时常数池、字段和方法数据,以及方法和构造方法的代码。它是在 Java 虚拟机...

2019-01-04 15:03:17 147

转载 如何判断一个元素在亿级数据中是否存在?

1.前言最近有朋友问我这么一个面试题目:现在有一个非常庞大的数据,假设全是 int 类型。现在我给你一个数,你需要告诉我它是否存在其中(尽量高效)。需求其实很清晰,只是要判断一个数据是否存在即可。但这里有一个比较重要的前提:非常庞大的数据。2.常规实现不考虑这个条件,我们脑海中出现的第一种方案是什么?我想大多数想到的都是用 HashMap 来存放数据,因为它的写入查询的效率都比较...

2018-12-27 20:03:11 162

原创 Spring事件处理——onApplicationEvent执行两次.md

我们知道Spring有两大类事件,一类是Application事件,超类是SpringApplicationEvent,这类事件是在Spring程序启动时,过程中分为几个阶段,每进行一个阶段,发出一个事件,依次对应ApplicationStartingEvent到ApplicationReadyEvent。标志着Application从启动开始到启动完成,各个阶段的分割点。参考Spring启动过程...

2018-12-26 20:44:51 12191 5

原创 Spring启动过程中Application事件的监听与处理.md

这篇博客是解决一个实际问题,在解决过程中梳理SpringApplicationEvent的运行机制和使用方法。这个问题是,微服务架构下,需要依次启动多个服务,服务之间存在运行时的依赖关系,必须保证多个服务的启动顺序。所以决定从Spring的Application事件入手。1.Application Events and Listeners我查了一些资料,通用的解决方案是:创建一个监听类,实现o...

2018-12-26 16:50:49 2604 6

原创 JVM内存模型——虚拟机栈详细讲解.md

0.JVM运行时数据模型Java 虚拟机的内存模型分为两部分:一部分是线程共享的,包括 Java 堆和方法区;另一部分是线程私有的,包括虚拟机栈和本地方法栈,以及程序计数器这一小部分内存。1.程序计数器和本地方法栈程序计数器和程序计数器比较简单,放在一块讲。1.1 程序计数器是一块小的内存空间,线程私有的。可以看做是当前线程所执行的字节码的行号指示器。每一个线程都有自己程序计数器。如...

2018-12-17 17:40:53 2850

原创 Beam分词计数.md

1.PCollection.apply介绍在文章开始之前,先来介绍下PCollection.apply方法:public OutputT apply(String name, PTransform<? super PCollection, OutputT> t) {return Pipeline.applyTransform(name, this, t);}第二个参数是B...

2018-12-14 17:11:10 219

原创 深入理解和实践git merge.md

1.git merge的简单理解看下git merge的命令:git merge hotfix例如当前的分支是master,那么这条命令的意思就是,将hofix分支的的修改同步到master分支。2. git merge 的两种实质操作过程2.1 结果为“快进”的git merge我们看一下操作过程:master分支的指针位于C2的节点,现在master出现了问题,我们从master...

2018-12-14 11:20:48 455

原创 最常用的git命令.md

1.最常用的git命令1.git add会把工作时的所有变化提交到暂存区git add file 提交单个文件git add . 提交所有文件2.git commit 主要是将暂存区里的改动给提交到本地的版本库git commit -m ‘desc’git commit --amend //也叫追加提交,它可以在不增加一个新的commit-id的情况下将新修改的代码追加到前一次的com...

2018-12-13 20:03:18 363

原创 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 4277

原创 运维常用的shell命令.md

1.后台启动脚本nohup ./start.sh > /dev/null 2>&1 &dev/null代表linux的空设备文件,所有往这个文件里面写入的内容都会丢失,俗称“黑洞”2>&1错误输出2重定向到标准输出1,意思是标准输出和错误输出都进了“黑洞”(错误输出通常是进程号)这句命令就是,后台执行start.sh,屏幕不打印任何信息。2.查看...

2018-12-12 20:24:26 6883 5

原创 Java类加载器和双亲委派模型.md

0.类加载过程一般来说,类加载分为3个过程,加载,链接和初始化。1.加载阶段,是Java将字节码数据从不同数据源读取到JVM中,并映射为JVM认可的Class对象,这里的数据源可能有Jar包,class文件,甚至网络数据源等。如果输入数据不是ClassFile结构,则会抛出ClassFormatError。2.链接,这是核心步骤,将原始的类定义信息平滑过渡到JVM运行过程中。细分为3个步骤...

2018-12-12 17:53:15 231

原创 Spring的JmsTemplate发送消息生成连接过多问题.md

我在使用SpringCloud框架重构我司的采集适配器时,使用的消息中间件有两个,一个是kafka,接收处理网关上报的原始数据。通过采集器的数据处理器之后,封装成为平台对象,发送到ActiveMq,进入平台业务系统。ActiveMq生产的功能,就简单使用Spring提供的jmsTemplate。但是在测试时发现了个问题。有天发现activeMq有些异常。问题描述:当采集器短时间内发送大量消息(...

2018-12-11 21:00:09 2345

原创 mvn deploy时返回400解决方法.md

使用mvn deploy命令,将打包后的jar包上传到私服时,出现了下面的问题:Return code is: 400, ReasonPhrase: Bad Request. -> [Help 1]一般通用有3个导致出现上面问题的原因:1.pom.xml中仓库id配置不对<distributionManagement> <repository>...

2018-12-11 20:15:35 8604 2

原创 AtomicInteger的实现原理.md

1.基本AtomicInteger是对Integer类型的一个包装,提供原子性的访问和更新操作。其原子性的操作是基于CAS实现的。CAS的过程是这样,执行运算时,使用当前数据值作为判断条件,利用CAS指令视图进行更新。更新之前获取内存中的最新值,与传来的当前值作比较。如果数值没有变,则说明没有其他线程进行并发修改,更新操作成功。则否则要么进行重试,要么返回结果。2.AtomaticInteg...

2018-12-11 20:01:05 1429

原创 拓展log4j——在写日志时加入自己的逻辑.md

在理解log4j实现的基础上,用一种聪明的来拓展log4j,实现在写日志的前后可以加入自己的逻辑

2017-09-06 11:12:06 513

原创 拓展Log4j基本尝试.md

上周老大让我拓展下apache的log4j,让其可以把日志内容当做事件,发送到消息队列当中,然后有专门的事件处理来订阅消息,同时事件处理程序和socket关联在一块。客户端通过socket请求日志信息,请求参数构成规则,来决定是否通过socket连接发送日志到客户端。现在我们把焦点放在“如何在打印日志的时候发消息”,至于事件处理程序暂且不表。我最开始的想法是,将日志内容分为分为4部分:日期,级别,所

2017-09-05 23:04:47 293

原创 《Java并发编程的艺术》笔记五——Java线程基础.md

0.线程的状态名称 说明 New 即线程刚刚创建,而并未执行 Runnable 运行状态,Java线程将操作系统中的就绪和运行两种状态笼统的称作“运行中” Blocked 阻塞状态,表示线程阻塞于锁 Waiting 等待状态,表示线程进入等待状态,需要等待其他线程做出一些动作(通知或中断) TimeWaiting 超时等待状态,在指定时间内自行返回 Termicaled 终止状

2017-09-03 13:38:30 275

原创 《Java并发编程的艺术》笔记四——Java如何实现原子操作.md

在Java中可以通过锁和循环CAS的方式实现原子操作。注:CAS(比较与交换,Compare and swap) 是一种有名的无锁算法。CAS的语义是“我认为V的值应该为A,如果是,那么将V的值更新为B,否则不修改并告诉V的值实际为多少”,CAS是一种 乐观锁 技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次

2017-08-13 20:54:16 316

原创 《Java并发编程的艺术》笔记三——锁的升级与对比.md

0. 背景Java SE1.6 为了减少获得锁和释放锁带来的性能消耗,引入了“偏向锁”和“轻量级”锁。在Java SE 1.6 中,锁一共有4种状态,级别从低到高依次是:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态。这几个状态会随着竞争情况依次升级。锁可以升级,但不能被降级,这意味着偏向锁升级为轻量级状态锁后不能降级成偏向锁。3.这种锁升级但不能降级的策略目的是提高获得锁和释放锁的效率。1

2017-08-13 17:17:43 518

原创 《Java并发编程的艺术》笔记二——Java并发机制的底层实现原理.md

0.Java代码执行过程Java代码在编译之后会变成Java字节码,Java字节码被类加载器加载到JVM中,JVM执行字节码,最终转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖与JVM的实现和CPU的执行。 b本节探讨下Java并发机制的实现原理。1. volatile的应用在并发编程中synchronized和volatile都扮演者重要角色。volatile是轻量级的synchro

2017-08-13 16:37:48 271

原创 《Java并发编程的艺术》笔记一——并发编程中的概念.md

0.背景最近重温《并发编程的艺术》这本书,觉得里面有些不错的内容,打算截取一部分作为笔记和大家共同学习。 并发编程的目的是让程序运行的更快。下面是并发编程的一些关键词:1 上下文切换即使是单核处理器也支持多线程执行代码,CPU通过给每一个线程分配CPU时间来实现这个机制。时间篇是CPU分配給各个线程的时间,因为通常时间片设置的很短,所以CPU通过不停的切换线程执行,给我们造成线程是同时运行的错觉。

2017-08-13 15:25:32 278

翻译 Netty5中文用户手册 Part 1.md

问题现在我们使用通用应用程序或者库与他人进行通信。例如,我们经常使用HTTP客户端库从Web服务器检索信息,并通过Web服务执行一个远程过程调用。 然而,通用协议或其实现有时不能很好地扩展。 这就像我们不使用通用HTTP服务器来交换大量文件,电子邮件消息和近实时消息,如财务信息和多人游戏的数据。 我们需要一种专门用于特殊目的高度优化的协议实现。 例如,您可能希望实现针对基于AJAX的聊天应用程序,

2017-08-13 14:56:09 1781

原创 《Spring Security教程系列》三.HttpSecurity的使用

HttpSecurity到目前为止我们的 SecurityConfig 只包含了关于如何验证我们的用户的信息。Spring Security怎么知道我们想对所有的用户进行验证?Spring Security怎么知道我们需要支持基于表单的验证?原因是我们的SecurityConfig类继承的WebSecurityConfigurerAdapter在 configure(HttpSecurity htt

2016-11-30 13:08:36 16280

原创 《Spring Security教程系列》二.初识Java 配置

Java配置使用and()方法相当于XML标签的关闭,这样允许我们继续配置父类节点。如果你阅读代码他很合理,我想配置请求验证,并使用表单和HTTP基本身份验证进行登录。1.Java配置和表单登录因此使用Java代码配置Spring Security主要是这两个步骤:1、创建过滤器2、注册过滤器。1.第一步创建过滤器这段配置创建一个Servlet Filter:springSecurityFilter

2016-11-30 12:55:25 1766

原创 《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 1207

原创 《Java并发系列》0.并发编程基础

1.线程现代操作系统调度的最小单元是线程,也叫轻量级进程,在一个进程中可以创建多个线程,这些线程都拥有各自的计数器,堆栈和局部变量等属性,并且能够访问共享的内存变量。一个普通的Java程序,运行main函数时可能出现的线程:mian //函数入口Reference Handler //清除Reference的线程Finalizer // 调用对象的finalize方法的线程Si

2016-11-15 20:46:08 232

原创 《Hadoop学习笔记系列》二.Hadoop分布式文件系统 HDFS

0.Hadoop分布式文件系统 HDFSHDFS以流式数据访问模式来存储超大文件,运行与商用硬件集群上。1.流式数据访问HDFS的构建思路:一次写入,多次读取是最高效的访问模式。2. Block数据块HDFS基本读写单位,类似于磁盘的页,每次都是读写一个块一般大小为64M,配置大的块目的是最小化寻址开销。 因为: 1)减少搜寻时间,一般硬盘传输速率比寻道时间要快,大的块可以减少寻道时间; 2

2016-11-06 13:03:08 406

原创 《JVM学习系列》四.垃圾收集算法及HotSpot的算法实现

0 说明本篇文章只是介绍几种算法的思想,实现细节不会过多的讨论。1.垃圾收集算法1.1标记-清除算法算法分为标记和清除两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象,它的标记过程就是使用可达性算法进行标记的。主要缺点有两个:效率问题,标记和清除两个过程的效率都不高空间问题,标记清除之后会产生大量不连续的内存碎片1.2复制算法复制算法:将可用内存按照容量分为大小相

2016-11-02 19:03:58 257

SSH整合模板

SSH入门必参考的整合模板

2016-03-20

SSH经典整合——超市管理

SSH经典整合——超市管理

2016-03-20

ASP+IIS+Access网站源码

功能说明: ZYCH网站管理系统 V04基本模块有: 新闻模块、单页模块、产品模块、下载模块、会员模块、视频模块、留言模块、 系统设置:对网站全局进行设置。一键更改网站状态、网站头部风格、修改网站标题、设置网站基本资料和网站系统属性等。 管 理 员:管理员分为超级管理员或普通管理员,超级管理员具有网站最高权限,普通管理员部分功能被限制。 模板显示设置:可设置各栏目显示条数、分页记录数等。 栏目导航:对网站导航菜单以及菜单排序等进行管理。 HTML静态:一键开启静态功能,实现页面生成HTML,访问速度更快。 安全设置:SQL注入管理,后台可设置SQL防注入参数等,SQL注入记录,可封锁攻击者IP等。 后台登陆记录:可查看管理员登陆的相关记录、IP、登陆时间等。 页面管理:创建和管理企业资料如:企业简介、企业荣誉、相关资质、服务特点、营销网络等。并具有单独设置关键词等功能。 新闻增加:新闻可设置标题颜色、是否外部链接、新闻略缩图、是否推荐、新闻点击等。 新闻管理:可分类查看新闻、修改新闻、批量推荐、删除新闻等。新闻分类。 相册管理:可分类查看照片、修改照片、批量推荐、删除照片等。相册分类。 服务项目:管理、添加、删除 团队管理:管理、分类、添加、删除! 服务流程:管理、添加、删除 产品管理:产品共有二级分类。产品略缩图、产品价格等。支持在线购买。产品推荐等。 下载功能:下载分类管理、程序语言、运行平台、推荐等级、程序大小、下载统计等功能。 会员管理:前台会员注册,后台修改会员资料,设置是否注册审核等。 会员订单:后台处理产品订单、在线付款。 广告管理:增加图片、文字、FLASH广告,定义尺寸、类型、生成JS调用。 幻灯管理:新闻幻灯、幻灯修改等。首页与频道页分开展示 招聘管理:在线发布招聘信息、修改、删除、管理职位。查看前台用户投至简历。 应聘管理:会员投递简历可直接到邮箱网站系统和后台。 友情链接:增加文字或图片链接、按文字或图片分类管理。 留言管理:留言增加是否审核功能,增加回复功能。前台发表和显示留言列表。 数据管理:数据库压缩、备份、还原 搜索引擎SEO:本程序已经进行简单SEO优化,大部门页面均可单独设置关键词等。默认模板代码优化。

2016-01-25

ubuntu10.10命令大全

ubuntu10.10命令大全,是PDF格式的

2016-01-25

jQuery1.11.0_文档

jQuery1.11.0帮助文档,更新和添加了一些方法,对于所有的方法有详尽的解释说明。

2015-08-08

Javascript教程--从入门到精通【完整版】

Javascript教程--从入门到精通【完整版】

2014-10-19

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除