自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(131)
  • 资源 (1)
  • 收藏
  • 关注

原创 AQS组件之CyclicBarrier

前面已经介绍了AQS及其两个组件,接下来看看CyclicBarrier这个组件。一、简介CyclicBarrier是另一种多线程并发控制使用工具,和CountDownLatch非常类似,他也 可以实现线程间的计数等待,但他的功能要比CountDownLatch更加强大一些。CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情 是,让一...

2019-02-06 17:59:58 640

原创 AQS组件之Semaphore

在前两篇说了AQS和CountDownLatch,现在我们来看看Semaphore。synchronized 和 ReentrantLock 都是一次只允许一个线程访问某个资源,Semaphore(信号量)可以指定多个线程同时访问某个资源。​ 用于保证同一时间并发访问线程的数目。信号量在操作系统中是很重要的概念,Java并发库里的Semaphore就可以很轻松的完成类似操作系统信号量的控制...

2019-02-05 22:20:24 206

原创 AQS组件之CountDownLatch

GitHub:https://github.com/JDawnF一、CountDownLatch简介CountDownLatch是一个同步工具类,用来协调多个线程之间的同步。这个工具通常用来控制线程等待,它可以让某一个线程等待直到倒计时结束,再开始执行。通过一个计数来保证线程是否需要被阻塞。实现一个或多个线程等待其他线程执行的场景。我们定义一个CountDownLatch,通过...

2019-02-03 22:42:52 347

原创 CopyOnWriteArrayList源码分析

前言:当我们想要用ArrayList,又想要保证线程安全的时候,可以考虑使用CopyOnWriteArrayList这个类。因为如果使用Vector的话,虽然可以保证线程安全,但是因为在Vector里面是用synchronized修饰的,所以开销会比较大。因此考虑使用CopyOnWriteArrayList。一.概述CopyOnWriteArrayList是concurrent 并发包...

2019-02-01 21:32:40 188

转载 servlet/tomcat等容器/springMVC之间的关系及声明周期

转自:https://www.jianshu.com/p/406a09136a18生命周期:https://www.cnblogs.com/lgk8023/p/6427977.htmlServlet是JavaEE规范的一种,主要是为了扩展Java作为Web服务的功能,统一接口。由其他内部厂商如tomcat,jetty内部实现web的功能。如一个http请求到来:容器将请求封装为servl...

2019-02-01 10:44:14 1233

原创 java内存模型之双重检测锁和延迟初始化

1 双重检查锁定及其存在的问题在单例模式中,普通的单例模式是线程不安全的,如下://懒汉式,线程不安全public static class SingleTon2 { public static SingleTon2 instance = null; private SingleTon2() { } public static SingleTon2 ...

2019-01-26 22:38:09 226

原创 Java内存模型之final的内存语义和happens-before

一、final域的内存语义1 final域的重排序规则对于final域,编译器和处理器要遵守两个重排序规则:1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。(即对构造函数的写入要在这个对象被其他线程看到之后)2)初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。p...

2019-01-26 22:36:31 628

原创 java内存模型之volatile和锁的内存语义

1.volatile的内存语义1.1 volatile的特性可以把对volatile变量的单个读/写,看成是使用同一个锁对这些单个读/写操作做了同步。如下面的例子:class VolatileFeaturesExample { volatile long vl = 0L; // 使用volatile声明64位的long型变量 public void set(long l) { ...

2019-01-26 22:33:52 247

原创 java内存模型之重排序和顺序一致性

1 Java内存模型的基础1.1 并发编程模型的两个关键问题在并发编程中,需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信。在消息传递的并发模型里,...

2019-01-26 22:26:34 697

原创 Java并发机制的底层实现原理

Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令。一、volatile的应用1.volatile的定义与实现原理Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了v...

2019-01-24 13:05:38 146 2

原创 深入理解Java虚拟机之线程安全与锁优化

1 Java语言中的线程安全按照线程安全的“安全程度”由强至弱来排序,我们可以将Java语言中各种操作共享的数据分为以下5类:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。1.不可变在Java语言中(特指JDK 1.5以后,即Java内存模型被修正之后的Java语言),不可变(Immutable)的对象一定是线程安全的,无论是对象的方法实现还是方法的调用者,都不需要再采取任何...

2019-01-22 11:58:28 453

原创 深入理解Java虚拟机之Java内存模型与线程

1 概述除了充分利用计算机处理器的能力外,一个服务端同时对多个客户端提供服务则是另一个更具体的并发应用场景。衡量一个服务性能的高低好坏,每秒事务处理数(TransactionsPer Second,TPS)是最重要的指标之一,它代表着一秒内服务端平均能响应的请求总数,而TPS值与程序的并发能力又有非常密切的关系。对于计算量相同的任务,程序线程并发协调得越有条不紊,效率自然就会越高;反之,线程之...

2019-01-22 11:51:31 400

转载 如何修改github上仓库的项目的语言类型

问题:在把项目上传到github仓库上时语言会显示错误语言比如我刚写的python程序显示的语言是html原理:github 是采用 Linguist来自动识别你的代码判断归为哪一类解决办法:我们在仓库的根目录下添加.gitattributes文件:并写入*.js linguist-language=java*.css linguist-language=java*...

2019-01-20 14:19:43 3374

原创 深入理解Java虚拟机之编译期优化

1 概述Java语言的“编译期”其实是一段“不确定”的操作过程,因为它可能是指一个前端编译器(其实叫“编译器的前端”更准确一些)把.java文件转变成.class文件的过程;也可能是指虚拟机的后端运行期编译器(JIT编译器,Just In Time Compiler)把字节码转变成机器码的过程;还可能是指使用静态提前编译器(AOT编译器,Ahead Of Time Compiler)直接把*....

2019-01-18 23:34:00 273

原创 Mac版idea搭建git并提交项目到GitHub

一.安装gitMac本机上好像是自带git命令的,但是一般我们还是会重新安装git。Mac上安装git的方法挺多的,但是最方便的还是通过brew这个神器。通过命令brew install git就可以自动安装git了,安装好的git目录在/usr/local/Cellar下面,不过我把它移到了/Library这个目录,个人习惯还是把一些编程相关的软件放到这个目录。安装好git之后,就要编写...

2019-01-16 23:06:27 4122

转载 JVM的符号引用和直接引用

转自:https://www.cnblogs.com/shinubi/articles/6116993.html在JVM中类加载过程中,在解析阶段,Java虚拟机会把类的二级制数据中的符号引用替换为直接引用。1.符号引用(Symbolic References):  符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能够无歧义的定位到目标即可。例如,在Clas...

2019-01-15 09:58:51 196

原创 Java文件之NIO核心组件之三选择器

一 Selector(选择器)介绍Selector 一般称 为选择器 ,也可以翻译为 多路复用器 。它是Java NIO核心组件中的一个,用于检查一个或多个NIO Channel(通道)的状态是否处于可读、可写。如此可以实现单线程管理多个channels,也就是可以管理多个网络链接。使用Selector的好处在于: 使用更少的线程来就可以来处理通道了, 相比使用多个线程,避免了线程上下文切...

2019-01-15 09:54:00 346

转载 Java文件之NIO核心组件之二通道

一 Channel(通道)介绍通常来说NIO中的所有IO都是从 Channel(通道) 开始的。 从通道进行数据读取 :创建一个缓冲区,然后请求通道读取数据。 从通道进行数据写入 :创建一个缓冲区,填充数据,并要求通道写入数据。 数据读取和写入操作图示:Java NIO Channel通道和流非常相似,主要有以下几点区别: 通道可以读也可以写,流一般来说是单向...

2019-01-15 09:46:07 324

原创 Java文件之NIO核心组件之一缓冲区

一、简介Java NIO Buffers用于和NIO Channel交互。 我们从Channel中读取数据到buffers里,从Buffer把数据写入到Channels.在Java NIO中使用的核心缓冲区如下(都是抽象类,覆盖了通过I/O发送的基本数据类型:byte, char、short, int, long, float, double ,long): ByteBuffer ...

2019-01-12 09:47:05 216

原创 Java文件之NIO

一、NIO简介Java NIO 是 java 1.4 之后新出的一套IO接口,这里的的新是相对于原有标准的Java IO和Java Networking接口。NIO提供了一种完全不同的操作方式。它支持面向缓冲的,基于通道的I/O操作方法。 随着JDK 7的推出,NIO系统得到了扩展,为文件系统功能和文件处理提供了增强的支持。 由于NIO文件类支持的这些新的功能,NIO被广泛应用于文件处理。...

2019-01-12 09:43:04 458

原创 深入理解Java虚拟机之虚拟机字节码执行引擎

目录1 概述2 运行时栈帧结构2.1 局部变量表2.2 操作数栈2.3 动态连接2.4 方法返回地址2.5 附加信息3 方法调用3.1 解析3.2 分派1 静态分派2 动态分派3 单分派和多分派4 虚拟机动态分派的实现3.3 动态类型语言的支持4 基于栈的字节码解释执行引擎4.1 解释执行4.2 基于栈的指令集和基于寄存器的指...

2019-01-10 10:19:22 261

原创 深入理解Java虚拟机之垃圾收集器和内存分配与回收策略

垃圾收集器主要包括:Serial收集器,ParNew收集器,Parallel Scavenge收集器,CMS收集器和G1收集器等。如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。虽然我们对各个收集器进行比较,但并非要挑选出一个最好的收集器。因为直到现在为止还没有最好的垃圾收集器出现,更加没有万能的垃圾收集器,我们能做的就是根据具体应用场景选择适合自己的垃圾收集器。...

2019-01-08 21:48:29 284

原创 深入理解Java虚拟机之JVM垃圾回收

1.JVM内存分配与回收Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时,Java 自动内存管理最核心的功能是 堆 内存中对象的分配与回收。当创建一个对象的时候,首先是在堆里面的新生代(或者叫做年轻代)的Eden区分配内存,当新生代内存满了之后,就会触发一次Young GC,然后将Eden区还在使用的对象复制到S1区(也称为From区),这样Eden又会空出来了,当E...

2019-01-08 21:37:46 238

原创 redis配置文件redis.conf讲解,哨兵,主从

1.Redis备份(持久化)       在 Redis 中存在两种方式的备份: 一种是快照(snapshotting),它是备份当前瞬间 Redis 在内存中的数据记录;另一种是只追加文件(Append-OnlyFile, AOF), 其作用就是当 Redis 执行写命令后,在一定的条件下将执行过的写命令依次保存在 Redis 的文件中, 将来就可以依次执行那些保存的命令恢复 Redis 的...

2018-12-28 23:51:00 2838

原创 Redis常用技术之事务、流水线、发布订阅、超时命令及Lua语言

一、Redis事务Redis的事务是使用 MULTI-EXEC的命令组合,使用它可以提供两个重要的保证 : 事务是一个被隔离的操作,事务中的方法都会被 Redis 进行序列化并按顺序执行, 事务在执行的过程中不会被其他客户端发生的命令所打断。 事务是一个原子性的操作,它要么全部执行,要么就什么都不执行。 在 Redis 中使用事务会经过 3 个过程:开启事务,命令进入队列,...

2018-12-24 23:35:54 564 2

原创 String、StringBuilder之hashCode方法

今天在看书的时候发现计算跟书上同样的字符串返回的是同样的hash值(如下图),觉得有点奇妙,就去看了String的源码,想看看这是为啥。由上面的两个图可以看到,"OK"这个字符串在不同机器上计算出来的hash值是一样的,这个刚开始有点让我意外,因为一直以为hash值是很神秘随机的,怎么会一样。直到我看了String的源码:public int hashCode() { ...

2018-12-22 08:52:30 1011

原创 SpringMVC工作原理及DispatcherServlet源码解析

一、SpringMVC整体流程先来看看SpringMVC的工作流程图:下面来看看每一步都是在做什么:第一步:用户发起request请求,请求至DispatcherServlet前端控制器。第二步:DispatcherServlet前端控制器请求HandlerMapping处理器映射器查找Handler。DispatcherServlet:前端控制...

2018-12-19 15:55:15 1206

原创 Spring Redis Data,RedisTemplate原理

1.获取一个RedisTemplate对象一般都是通过连接池连接Redis的,要在spring中使用Redis,首先,我们需要配置JedisPoolConfig对象,如下图:在使用 Spring提供的 RedisTemplate之前需要配置 Spring所提供的连接工厂,在 Spring Data Redis 方案中它提供了 4 种工厂模型:JredisConnectionFactor...

2018-12-15 22:48:13 4992 2

原创 网页静态化技术---freeMarker 入门

 前言:网页静态化技术和缓存技术的共同点都是为了减轻数据库的访问压力,但是具体的应用场景不同,缓存比较适合小规模的数据,而网页静态化比较适合大规模且相对变化不太频繁的数据。另外网页静态化还有利于SEO。另外我们如果将网页以纯静态化的形式展现,就可以使用Nginx这样的高性能的web服务器来部署。Nginx可以承载5万的并发,而Tomcat只有几百。关于Nginx我们在后续的课程中会详细讲解...

2018-12-08 00:20:22 134

原创 数据库连接:ERROR 1045 (28000): Access denied 和ERROR 1130 (HY000): Host '192.168.xxx' is not allowed

连接远程数据库的时候,由于可能没有权限,所以会报下面这两个错误:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password)ERROR 1130 (HY000): Host '192.168.xxx.xxx is not allowed to connect to this MySQL本质上...

2018-12-07 00:18:38 1278

原创 cas连接报错,ACTION: AUTHENTICATION_FAILED

在cas的deployerConfigContext.xml这个文件里面增加了连接数据库的bean,然后发现数据库里面的用户名登不上去,看Tomcat又没什么报错。。如下图:首先,考虑 deployerConfigContext.xml里面配的连接数据库的bean,要在配置文件的上面修改一下:2.考虑可能是远程数据库拒绝访问,这个时候就要改你远程数据库了。参考这个: https:/...

2018-12-07 00:12:59 5133

原创 大型网站技术架构之架构演化发展历程

前言:大部分来自《大型网站技术架构》,小部分来自个人见识,欢迎指正。1.初始阶段:最开始的时候,基本上就只有一个服务器。所有的资源,如:应用程序、数据库、文件等都在一台服务器上。这个时候基本还没什么访问量,或者说是处于开发阶段,还没有正式上线部署应用,所以计算、运行等资源还不用太多。2.应用数据和数据服务分离 等到应用上线了之后,访问量会变得越来越多。这个时候一台服务器的不足之...

2018-12-05 17:16:52 537

原创 什么是悲观锁和乐观锁

一、何为悲观锁、乐观锁1、悲观锁顾名思义,就是比较悲观的锁,总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchro...

2018-12-05 15:01:02 46890 2

原创 springboot启动报错:Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException:

springboot启动类启动的时候报错:Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'errorPageFilter' for bean class [org.springframework.boot.web...

2018-12-01 17:35:36 2334 1

原创 深入理解LinkedHashMap 源码分析

一、LinkedHashMap结构 这是一个有序的,底层是继承于 HashMap 实现的,由一个双向链表所构成,具有和 HashMap 一样的快速查找特性。 LinkedHashMap 的排序方式有两种: 根据写入顺序排序。 根据访问顺序排序,每次 get 都会将访问的值移动到链表末尾,这样重复操作就能得到一个按照访问顺序排序的链表。 数据结构,通过以下代码调试可以看...

2018-11-30 16:54:03 226 1

原创 dubbo入门

前言:在目前火热的微服务开发中,有两种比较有名的开发方式,一种是spring cloud,另一种则是通过dubbo。本文主要介绍一下dubbo的相关知识。dubbo是一种rpc,即远程调用框架的实现,主要提供了服务注册,服务消费,服务管理中心等功能。一、什么是dubbo?dubbo是一种rpc,即远程调用框架的实现,主要提供了服务注册,服务消费,服务管理中心等功能。我们先来看dubbo的架...

2018-11-30 10:48:48 145

原创 HTTP请求的GET与POST方式的区别

一、两者的各自特点:使用GET方法时,查询字符串(键值对)被附加在URL地址后面一起发送到服务器,有以下特点: GET请求能够被缓存 GET请求会保存在浏览器的浏览记录中 以GET请求的URL能够保存为浏览器书签 GET请求有长度限制,最多只能1024字节 GET请求主要用以获取数据 可能不是很安全,请求数据会暴露在url中 get将表单中数据按照name=value...

2018-11-29 16:38:16 306

原创 动态代理,反射的用途及实现

一、反射: 反射的概念:动态加载对象,并对对象进行剖析。在Java中的反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法,这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制 反射的功能:利用Java反射机制我们可以加载一个运行时才得知名称的class,获悉其构造方法,并生成其对象实体,能对其fi...

2018-11-29 14:51:45 3006

原创 谈一谈web.xml中的context-param和init-param

web.xml是web项目的一个配置文件,主要就是用来配置Listener、Filter、Servlet等。web.xml文件包括xml文件头,DOCTYPE声明,web-app元素。就是配置一些监听器,过滤器还有做一些servlet的映射。关于servlet可以看看这个。接下来主要就是看看<context-param>和<init-param>分别是有什么,有什么作用...

2018-11-26 22:43:24 532 1

原创 后端程序员需要了解的前端知识(持续更新中)

一、FastJson1.对于JSON格式字符串、JSON对象及JavaBean之间的相互转换JSON:fastJson的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换。JSONObject:fastJson提供的json对象。JSONArray:fastJson提供json数组对象。参照:https://www.cnblogs.com/cdf-open...

2018-11-24 18:37:47 5316 1

Java开源项目

提高个人技术的开源项目,可以自己下下来好好研究一下,提高自己的技术

2018-11-11

空空如也

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

TA关注的人

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