自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 volatile的实现原理

    Java语言提供了volatile,在某些情况下比锁更加方便。如果一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。    那volatile是如何实现可见性的呢,如果我们对volatile修饰的字段进行写操作时,CPU会做些什么事情呢。        如果将上述代码转变成汇编代码,如下:    被volatile变量修饰的共享变量进行写操作的时候...

2018-05-10 21:59:54 2808

原创 Java中的AQS(三)线程的阻塞和唤醒

一、线程的阻塞:        在上一篇说到,线程获取同步状态失败的线程,会构造节点并加入到同步队列的尾部,然后通过自旋的方式不断的获取同步状态,但是在自旋过程中需要判断线程是否需要阻塞,我们再一次看一下acquire方法。final boolean acquireQueued(final Node node, int arg) { boolean failed = true; t...

2018-05-09 16:00:13 1254

原创 Java中的AQS(二)同步状态的获取与释放

上一篇博客主要讲了AQS的结构。而这片博客主要针对于同步状态的获取与释放。在此之前,先看一下AQS提供的模板方法    AQS提供的模板方法基本分为3类:独占式获取与释放同步状态,共享式获取与释放同步状态和查询同步队列中的等待线程情况。一、独占式同步状态获取与释放public final void acquire(int arg) { if (!tryAcquire(...

2018-05-09 11:49:38 985

原创 Java中的AQS(一)AQS简介

    队列同步器AbstractQueuedSynchronizer,是用来构建锁或者其他同步组件的基础框架,它使用一个int成员表示同步状态,通过内部的FIFO队列来完成资源获取线程的排序工作。一、AQS的设计    AQS的设计是基于模板方法模式的,也就是说,使用者需要继承AQS并重写指定的方法,随后将AQS组合在自定义同步组件的实现中,并调用AQS提供的模板方法,而这些模板方法将会调用使用...

2018-05-09 01:01:50 3778

原创 Mybatis的分页插件pagehelper的使用介绍

一点都不萌的博主来水了,哈哈。今天给大家介绍一下分页插件pageHelper的使用首先我用的是maven项目,单纯的是一个顾客的增删改查下面这是pageheilper的maven依赖 com.github.pagehelper pagehelper 4.1.3 下来给大家说一下配置

2017-11-11 15:36:32 443 1

原创 从jsp页面发送ajax请求,servlet接受参数并返回json数据

博主注册了CSDN好久了,一直没写过(哈哈)今天遇到了问题把我难住了,解决之后就赶紧来记下来这是一个很简单的更新用户的问题先来看看项目所需jar包接下来就是jsp页面的东西,ajax发送id然后在servlet接受参数,并去数据库查询结果String id = request.getParameter("id"); //System.out.println(

2017-11-05 00:16:21 29730 6

原创 Java内存模型与单例模式

我们直接进入正题这是双重校验锁的单例模式 private static Singleton instance; //1 public static Singleton getSingleton(){ if (instance == null){ //2 synchronized (Singleton.class){ //3...

2018-07-28 14:55:27 234

原创 Java内存模型中的happens-before

一、happens-before的定义①如果一个操作happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见,且第一个操作的执行顺序在第二个操作之前②两个操作之间存在happens-before关系,并不意味着必须按照happens-before关系指定的顺序来执行。如果重排序之后的执行结果,与按happens-before关系来执行的结果一致,这种重排序是合法的...

2018-07-28 12:49:43 157

原创 Java内存模型中的重排序

重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。但是不能随时随地的重排序,我们可以看一个例子看待这个问题。上面三种情况,只要重排序两个操作的执行顺序,那么程序的结果就会被改变。所以 重排序需要遵守一些规则。a、编译器和处理器不会改变存在数据依赖性关系的两个操作的执行顺序b、单线程下,不能改变数据的执行结果一、数据依赖性在上面的情况中,我们...

2018-07-27 21:52:30 1130

原创 Redis的复制

在Redis中,用户可以通过SALVEOF命令或者设置配置文件中salveof选项,让一个服务器去复制另一个服务器,被复制的服务器成为主服务器,对主服务器进行复制的服务器称为从服务器。一、旧版复制功能的实现Redis的复制功能分为同步和命令传播两个操作a、同步:同步操作用于将服务器的数据库状态更新至主服务器当前所处的状态b、命令传播:命令传播操作则用于在主服务器的数据库状态被修改,...

2018-07-27 16:00:57 331

原创 Redis持久化

我们知道Redis是内存数据库,他将自己的数据库状态存储在内存中,那么当服务器进程退出,服务器中的数据库状态也会消失。为了解决这个问题,Redis通过了两种持久化功能,分别是RDB持久化和AOF持久化一、RDB持久化RDB持久化可以手动执行,也可以根据服务器配置选项定期执行,该功能可以将某个时间点上的数据库状态保存到一个RDB文件中,RDB持久化功能所生成的RDB文件是一个经过压缩的二...

2018-07-27 10:33:00 87

原创 Redis中的数据库

一、Redis中的数据库在Redis中,每个客户端都有自己的目标数据库,每当客户端执行数据库写命令或者数据库读命令的时候,目标数据库就会成为这些命令的操作对象。默认情况下,Redis有16个数据库,从0号数据库到15号数据库。在默认情况下,Redis客户端的数据库为0号数据库,但客户端可以通过执行select命令来切换数据库。切换之后,在客户端中会显示数据库的标号(当然0号数据库不显示...

2018-07-26 20:31:11 5199

原创 服务注册中心

一、服务注册中心介绍分布式服务框架部署在多台不同的机器上,例如服务提供者在集群A,服务调用者在集群B,那么B在调用A的服务的过程中,集群A的机器需要和集群B的机器进行通信。抠张图看看 在上图中,有这么几个问题需要解决:①集群A的服务调用者如何发现集群B的服务提供者②集群A的服务调用者如何选择集群B中的某一台服务提供者机器发起调用③集群B的服务提供者机器下线之后,集群A中...

2018-07-25 21:34:48 5918

原创 分布式事务的一致性

今天在看书的时候,看到了分布式事务的一致性问题,就赶紧记下来。一、分布式事务介绍在我们平时写的代码中,我们可以用一个事务包含许多个SQL调用,如果某一个数据库操作发生异常,就可以将之前的SQL操纵全部进行回滚,只有当所以的SQL操作全部成功,才进行提交,这就保证了事务的一致性。抠张图看看 但是在分布式环境下,多个数据库操作可能被拆分到独立的三个数据库访问服务中,此时原来的本地S...

2018-07-25 20:27:44 2700 1

原创 Spring源码解析之配置文件的解析

此篇博客篇幅较长,请耐心阅读,可能我文笔不太好,但是请仔细看博客中的代码的注释和说明,这样能帮助你理解。有什么问题可以回复。  直接进入正题,在使用Spring时,我们经常要进行大量的配置来告诉Spring,我们需要什么样的功能。但是配置文件又是怎么被Spring解析变成Spring所需要的东西呢。  Spring中有一个接口类,名叫BeanDefinition,配置文件中的<bea...

2018-07-22 16:33:30 827

原创 IDEA下搭建taotao商城

首先看一下项目的结构图                        打开IDEA,新建一个空项目        输入项目名,点击finishOK,接下来创建父工程taotao-parent,File->New->Module选择Maven,勾上对号,选择quicksort输入信息,点击next点击+号输入信息,name=archetypeCatalog  value=internal...

2018-05-28 23:17:05 2245 8

原创 使用NIO实现一个echo服务器

    一个简单的echo服务器,客户端向服务端发送消息,服务端进行响应,当客户端发送quit字符串时,断开客户端和服务端的连接。使用NIO实现    服务端代码public class EchoServer_NIO { private Selector selector; private ByteBuffer sendBuf = ByteBuffer.allocate(1024)...

2018-05-26 21:00:54 382

原创 使用BIO实现一个简单的echo服务器

    一个简单的echo服务器,客户端向服务端发送消息,服务端进行响应,当客户端发送quit字符串时,断开客户端和服务端的连接。    服务端代码:public class EchoClient_BIO { private Socket socket; public static void main(String[] args) { new EchoClient...

2018-05-26 14:34:59 390

原创 动手实现一个简单的RPC框架

    RPC(Remote Procedure Call,远程过程调用)一般用来实现部署在不同机器上的系统之间的方法调用,是的程序能够像访问本地资源一样,通过网络传输去访问远端系统资源。RPC框架实现的架构原理都是类似的,如下图所示。                    Client Code:客户端调用方代码,负责发起RPC调用,为调用方提供接口    Serialization:负责对RP...

2018-05-25 20:55:25 1518

原创 MySql悲观锁和乐观锁的使用

    现在我有一个购买商品的需求,我们知道当我们购买商品时,后台会进行减库存和增加购买记录的操作。我们分别在无锁和乐观锁和悲观锁进行相应的代码演示来说明问题。    建表语句如下:CREATE TABLE `stock` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL DEFAULT...

2018-05-25 13:37:13 25310 12

原创 网络I/O模型

首先先说一下同步、异步和阻塞、非阻塞的一些概念1、同步和异步    同步和异步描述的是用户线程与内核的交互方式:    同步是指用户线程发起I/O请求后需要等待或者轮询内核I/O操作完成时才能继续执行    异步是指用户线程发起I/O请求后仍继续执行,当内核I/O操作完成后会通知用户线程,或者调用用户线程注册的回调函数。2、阻塞和非阻塞    阻塞和非阻塞描述的是用户线程调用内核I/O操作的方式:...

2018-05-24 22:22:54 477

原创 动手实现自己的SSM

    在分别实现了Spirng的IOC,SpringMvc的请求分发以及Mybatis的简单实现之后,我就想着将三个整合一下。经过一番折腾,终于完成了。    原谅我不去说一下整合的事,相信大家看了我之前的博客,关于SpringMvc,Mybatis之后,整合对大家来说是没有什么压力的。在这里,博主就贴一下代码就行,读者可以自行理解。实现并不难,大家都能看懂。    代码所在:https://g...

2018-05-23 18:59:18 80

原创 理解Mybatis的设计思想。动手实现迷你Mybatis

参考:https://www.jianshu.com/p/73ee8caddc68?open_source=weibo_searchMybatis的架构图:我们要实现的迷你Mybatis的整体框架思路:执行器MyExecutor:public interface MyExecutor { public <T> T query(String statement);}这里为了方便...

2018-05-23 17:49:57 1209

原创 动手实现SpringMvc

参考这里的:https://blog.csdn.net/timheath/article/details/69663495

2018-05-23 17:21:09 62

原创 GET请求和POST请求的对比

    GET请求从指定的资源请求数据    POST请求向指定的资源提交数据1、请求数据的格式            GET请求:请求的数据会附加在URL之后,以?分割URL和数据,多个参数用&符号连接。            POST请求:POST请求会将请求的数据会放在请求体中。            因此GET请求的参数可以在地址栏看到,而POST请求不会2、请求数据的大小    ...

2018-05-21 11:04:13 79

原创 过滤器Filter

    过滤器时JavaWeb三大组件之一,它与Servlet很相似。不过过滤器是用来拦截请求的,而不是处理请求的。    当用户请求某个Servlet时,会先执行部署在这个请求上的Filter,如果Filter放行,则会执行用户请求的Servlet;如果Filter不放行,那么就不会执行用户请求的Servlet。    1、过滤器的生命周期        a、init:在服务器启动时创建Filt...

2018-05-21 10:38:02 149

原创 jsp和el表达式

一、JSP    1、jsp简介            Java 服务器页面 (Java Server Page ,JSP) 以扩展名 .jsp 保存        jsp可以有效地控制动态内容生成        可以在JSP里面使用 Java 编程语言和类库        JSP中的HTML 代码用于表示页面,而 J其中的ava 代码用于访问动态内容    2、...

2018-05-21 00:25:53 60

原创 Cookie和Session

    我们知道,HTTP协议是无状态的,也就是说每个请求都是独立的,无法记录上一次请求的状态。但HTTP协议中可以使用Cookie来完成会话跟踪。    在JavaWeb中,使用Session来完成会话跟踪,Session底层依赖Cookie技术。一、Cookie        1、Cookie概述        Cookie是一个键值对组成的,随着服务器端的响应发送给客户端浏览器。浏览器会把C...

2018-05-20 22:41:05 106

原创 JavaWeb中的Request和Response

一、Request    1、request的功能:       a、 获取请求的方式: String getMethod()       b、获取请求头:String getHeader(String name)       c、获取请求参数(URL或者请求体中的参数):String getParameter(String name)    2、请求编码        a、地址栏的参数是GBK ...

2018-05-20 18:06:05 426

原创 JavaWeb中的Servlet

JavaWeb技术是当今主流的互联网Web应用技术之一,而Servlet是JavaWeb技术的核心基础。一、Servlet的层次结构                        实现Servlet有三种方式:                实现Servlet接口;                继承GenericServlet类;                继承HttpServlet类(最佳...

2018-05-20 13:27:49 310

原创 动手实现简单的线程池

    废话不多说,直接开始。一、属性变量    线程的属性变量如下//线程池是否关闭private boolean isClosed = false;//任务队列private LinkedList<Runnable> workQueue;//线程池idprivate static int threadPoolId;//线程idprivate int threadId;...

2018-05-13 18:06:28 71

原创 Java中的Fork/Join框架

    Fork/Join是Java7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。   一、 Fork/Join的运行流程图                            二、工作窃取算法    工作窃取算法是指某个线程从其他队列里窃取任务去执行。在处理一个大任务时,将这个大任务分成若干个小任务,放在不同的队列里,如果某...

2018-05-13 13:00:41 462

原创 动手实现阻塞队列

    使用等待通知模式实现阻塞队列一、阻塞队列的属性    1、一个存储数据的数组    2、添加元素的索引,相当于队尾    3、取出元素的索引,相当于队头    3、队列中的元素个数    4、一个互斥锁    5、一个监视队列为空的监视器,一个监视队列为满的监视器//存储数据的数组private Object[] data;//添加下标和删除下标和数组当前数量private int ...

2018-05-13 10:30:39 118

原创 LinkedBlockingQueue源码解析(JDK1.8)

    LinkedBlockingQueue是一个用链表实现的有界队列。此队列的默认长度和最大长度为Integer.MAX_VALUE。一、属性变量//队列容量private final int capacity;//队列中的元素个数private final AtomicInteger count = new AtomicInteger();//队头transient Node&lt...

2018-05-13 00:59:58 174

原创 ArrayBlockingQueue源码解析(JDK1.8)

    ArrayBlockingQueue是一个基于用数组实现的有界阻塞队列。此队列按照先进先出的原则对元素进行排序一、成员变量//存放元素的数组final Object[] items;//队头int takeIndex;//队尾int putIndex;//队列中的元素个数int count;//final ReentrantLock lock;//监视队列是否为空的监视...

2018-05-12 23:23:53 208

原创 ConcurrentLinkedQueue源码解析(JDK1.8)

    实现线程安全的队列有两种方式:一种基于阻塞的实现,用锁实现;另一种是基于非阻塞的实现,使用循环CAS实现。ConcurrentLinkedQueue就是基于非阻塞的方式实现的一、属性变量//队头private transient volatile Node<E> head;//队尾private transient volatile Node<E> tail;...

2018-05-12 22:51:27 470

原创 ReentranLock源码解析

    重入锁ReentranLock,它表示该锁能够支持一个线程对资源的重复加锁。除此之外,该锁还支持获取锁时的公平性和非公平性选择。一、属性变量private final Sync sync;    定义在ReentranLock中的一个类,该类实现了AQS。并且有两个子类,分别是公平锁和非公平锁。根据需要可以创建不同的锁。二、内部类1、Sync类abstract static class S...

2018-05-12 21:02:33 193

原创 录制JMeter脚本的方式

一、使用BadBoy录制JMeter脚本    JMeter和BadBoy下载地址:点击去下载    1、打开BadBoy并输入你要录制脚本的网址    这里我输入百度的网址,可以看到step下已经有一个请求了    2、录制完点击左上角的file,选中Export to JMeter    3、选择存储的位置                                            ...

2018-05-12 15:57:44 6369 3

原创 JMeter参数化post请求

这篇博客主要讲解JMeter的参数化post请求没有安装JMeter的可以找我的上一篇博客进行下载安装下面开始测试的步骤一、创建线程组                        这没有什么好说的,这里创建3个线程是因为我只测三组数据二、创建HTTP请求                注意到,着里id和name,我空着没写,因为我们要将的就是参数化三、创建数据文件    这个数据文件,你可以自己...

2018-05-12 14:26:27 10425

原创 JMeter初次使用

    这篇博客主要说的是get请求测试,post请求测试在下一篇一、下载JMeter    JMeter下载地址:点击这里    下载之后,经过解压就能使用。二、选择语言    其实我对这些软件的语言不感冒,所以我是无所谓,有想改的可以改一下哈        点击左上角的options,选择choose Language,选中你所喜欢的语言三、测试步骤    1、添加线程组           ...

2018-05-12 10:53:34 190

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