自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 资源 (2)
  • 收藏
  • 关注

原创 Golang 解析json

如果json是map结构strJson{ "总就业人数": 1375.66, "第一产业": 40.83, "第二产业": 422.82, "省代码": 310000.0, "省": "上海市", "市代码": 310000.0, "市": "上海市", "类型": "直辖市"}var f interface{}json.Unmarshal([]byte(strJson), &f)if reflect.TypeOf(f).Kind() == reflect.Map

2021-01-08 21:30:33 179

原创 《go语言圣经》+《Mastering.GO-cn》+《go语言高级编程》PDF下载

公众号【爱吃橙子的搬砖小徐】开通啦,后续将会同步更新,欢迎订阅回复【java面试】获得两套面试宝典回复【golang】获得go语言学习三部曲《go语言圣经》+《Mastering.GO-cn》+《go语言高级编程》回复【数据结构】获得完整学习视频...

2021-01-06 14:05:10 833

原创 Redis中的基本数据类型及其存储原理

前言redis是一种常见的NOSQL数据库,它支持五种数据类型:String字符串,Hash哈希,List列表,Set集合及ZSet有序集合,今天我们来讲讲它们的用法以及存储原理基本数据类型String字符串主要用来存储字符串、整数、浮点数操作命令插入一个值set test 1 批量插入mset tom 2 jack 6获取值get test批量获取mget tom jack加锁插入,如果 key 存在,则不成功。可用于分布式锁,可通过del key释放锁setnx t

2020-11-11 17:04:12 1799

原创 Golang中sync.Map的实现原理

前言前面,我们讲了map的用法以及原理Golang中map的实现原理,但我们知道,map在并发读写的情况下是不安全。需要并发读写时,一般的做法是加锁,但这样性能并不高,Go语言在 1.9 版本中提供了一种效率较高的并发安全的 sync.Map,今天,我们就来讲讲 sync.Map的用法以及原理使用方法func main() { var m sync.Map //插入 m.Store("1","a") //取值 fmt.Println(m.Load("1")) //删除 m.Delete(

2020-11-05 14:50:05 2625

原创 Golang中panic与recover的实现原理

今天我们讲讲golang中panic异常,以及recover对异常的捕获,由于panic、recover、defer之间非常亲密,所以今天就放在一起讲解,这里会涉及到一些defer的知识,有兴趣可以看我的另一篇关于defer的文章 Golang中defer的实现原理.Panic异常Go的类型系统会在编译时捕获很多错误,但有些错误只能在运行时检查,如数组访问越界、 空指针引用等。这些运行时错误会引起painc异常。一般而言,当panic异常发生时,程序会中断运行,并立即执行在该goroutine中被延迟

2020-10-24 15:52:20 2457 12

转载 Golang中context实现原理剖析

转载: Go 并发控制context实现原理剖析1. 前言Golang context是Golang应用开发常用的并发控制技术,它与WaitGroup最大的不同点是context对于派生goroutine有更强的控制力,它可以控制多级的goroutine。context翻译成中文是"上下文",即它可以控制一组呈树状结构的goroutine,每个goroutine拥有相同的上下文。典型的使用场景如下图所示:上图中由于goroutine派生出子goroutine,而子goroutine又继续派生新的

2020-09-18 12:02:09 2220 1

原创 Golang中defer的实现原理

前言在Go语言中,可以使用关键字defer向函数注册退出调用,即主函数退出时,defer后的函数才被调用。defer语句的作用是不管程序是否出现异常,均在函数退出时自动执行相关代码。 所以,defer后面的函数通常又叫做延迟函数defer规则1.延迟函数的参数在defer语句出现时就已经确定下来了func a() { i := 0 defer fmt.Println(i) i++ return}返回结果:defer语句中打印的变量i在defer出现时就已经拷

2020-09-14 16:23:49 950

原创 Kubernetes组件详解

在前面,我们大概讲解了Kubernetes包含的组件,今天,我们就来详细讲解一下这些组件的作用与使用Pod在Kubernetes中,最小的管理元素不是一个个独立的容器,而是Pod,Pod是最小的,管理,创建,计划的最小单元.使用方法1.创建一个pod的yaml文件,名称为nginx_pod.yamlapiVersion: v1 // 版本号kind: Pod //类别metadata: name: nginx-pod

2020-08-27 17:51:59 554

原创 Kubernetes集群的搭建

准备准备3台centos要保证彼此之间能够ping通,也就是处于同一个网络中版本统一Docker 18.09.0kubeadm-1.14.0-0kubelet-1.14.0-0kubectl-1.14.0-0k8s.gcr.io/kube-apiserver:v1.14.0k8s.gcr.io/kube-controller-manager:v1.14.0k8s.gcr.io/kube-scheduler:v1.14.0k8s.gcr.io/kube-proxy:v1.14

2020-08-26 17:19:25 450 1

原创 Kubernetes的概述与架构

概述Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。Kubernetes一个核心的特点就是能够自主的管理容器来保证云平台中的容器按照用户的期望状态运行着(比如用户想让apache一直运行,用户不需要关心怎么去做,Kubernetes会自动去监控,然后去重启,新建,总之,让apache一直提供服务),管理员可以加载一个微型服务,让规划器

2020-08-26 16:54:38 336

原创 Golang中select的实现原理

前言select是Golang在语言层面提供的多路IO复用的机制。与switch语句稍微有点相似,也会有case和最后的default选择支。每一个case代表一个通信操作(在某个channel上进行发送或者接收)并且会包含一些语句组成一个语句块。基本用法select会等待case中能够执行的case时才去执行。当满足条件时。select才回去通信并执行case之后的语句,这时候其他通信是不执行的。如果有多个case同时就绪,select会随机选择一个执行。一个没有任何case的select语句,会永

2020-08-19 20:30:07 1587 3

转载 Go 逃逸分析

前言所谓逃逸分析(Escape analysis)是指由编译器决定内存分配的位置,不需要程序员指定。函数中申请一个新的对象如果分配 在栈中,则函数执行结束可自动将内存回收;如果分配在堆中,则函数执行结束可交给GC(垃圾回收)处理;有了逃逸分析,返回函数局部变量将变得可能,除此之外,逃逸分析还跟闭包息息相关,了解哪些场景下对象会逃逸至关重要。逃逸策略每当函数中申请新的对象,编译器会跟据该对象是否被函数外部引用来决定是否逃逸:如果函数外部没有引用,则优先放到栈中;如果函数外部存在引用,则

2020-08-13 17:20:49 173

原创 Golang中的goroutine调度

前言在go语言中,每一个并发的执行单元叫做一个goroutine。你可以启动许多甚至成千上万的goroutine,Go的runtime负责对goroutine进行管理。所谓的管理就是“调度”,粗糙地说调度就是决定何时哪个goroutine将获得资源开始执行、哪个goroutine应该停止执行让出资源、哪个goroutine应该被唤醒恢复执行等Goroutine调度器线程数过多,意味着操作系统会不断的切换线程,频繁的上下文切换就成了性能瓶颈。 Go提供一种机制,可以在线程中自己实现调度,上下文切换更轻量

2020-07-17 20:20:09 872

原创 Golang中channel的实现原理

前言如果说goroutine是Go语言程序的并发体的话,那么channel则是它们之间的通信机制。一个channel就是一个通讯机制,可以让一个goroutine通过它给另一个goroutine发送值信息。每一个channel都有一个特殊的类型,也就是channel可发送数据的类型。与map类似,channel也对应一个make创建的底层数据结构的引用。当我们复制一个channel或者用于函数参数传递时,我们只是拷贝了一个channel引用,因此调用者和被调用者将引用同一个channel对象。两个相同

2020-07-15 17:11:44 2070

原创 Golang中map的实现原理

前言在Go语言中,一个map就是一个哈希表的引用。它是一个无序的key/value对的集合,其中,所有的key都是不同的。然后通过给定的key可以在常数时间复杂度内检索、更新或删除对应的value在map中的元素不是一个变量,因此不能对map的元素进行取址操作。因为map可能随着元素数量的增加而重新分配内存更大的内存空间,从而导致之前的地址失效map实现原理注意:我会把源码中每个方法的作用都注释出来,可以参考注释进行理解。数据结构我们先来看一下map数据结构runtime/map.go/

2020-07-11 17:36:46 804

原创 Golang中slice的实现原理

前言简单来说,切片就是一种简化版的动态数组。因为动态数组的长度是不固定,切片的长度自然也就不能是类型的组成部分了。数组虽然有适用它们的地方,但是数组的类型和操作都不够灵活,因此在Go代码中数组使用的并不多。而切片则使用得相当广泛。Slice源码分析注意:我会把源码中每个方法的作用都注释出来,可以参考注释进行理解。在看源码之前,我们先来看一个简单的例子func main() { slice:=make([]int,0) //第6行 slice=append(slice,1)//第7行}

2020-07-09 13:47:41 1224

原创 常见的设计模式之装饰器模式

概念装饰器模式(Decorator Pattern),也称包装模式(Wrapper Pattern)是指在不改变原有对象的基础上,将功能附加到对象上。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。装饰器模式主要包含四个角色:抽象组件(Component):可以是一个接口或者抽象类,其充当被装饰类的原始对象,规定了被装饰对象的行为具体组件(ConcreteComponent):实现或继承Component的一个具体对象,也就是被装饰对象抽象装饰器(Decorator):通用的装饰C

2020-06-15 16:53:10 189

原创 常见的设计模式之建造者模式

概念建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。建造者模式主要包含四个角色:产品(product):要创建的产品类对象建造者抽象(builder):建造者的抽象类,规范产品对象的各个组成部分的建造,一般由子类实现具体的建造过程建造者(concreteBuilder):具体的builder类,根据不同的业务逻辑,具体化对象的各个组成部分的创建调用者(director):调用具体的创建

2020-06-14 16:25:54 232

原创 常见的设计模式之原型模式

概念原型模式(Prototype pattern)是指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象,属于创建者模式原型模式主要包含三个角色:客户(client):客户类提供创建对象的请求抽象原型(prototype):规定拷贝接口具体原型(concrete prototype):被拷贝的对象注意:对不通过new关键字,而是通过对象拷贝来实现创建对象的模式就称为原型模式实现浅克隆标准写法1.创建原型接口public interface IPrototype<

2020-06-13 16:32:38 308

原创 常见的设计模式之责任链模式

概念责任链模式(Chain of Responsibility Pattern)是将链中的每一个节点看做一个对象,每个节点处理的请求均不相同,且内部维护下一节点对象。当一个请求从链式的首段发出时,会沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求为止。这种类型的设计模式属于行为型模式。责任链模式主要包含两种角色:抽象处理者(Handle):定义一个处理的方法,并维护下一个处理节点Handle对象的引用;具体处理者(ConcreteHandle):对请求进行处理,如果不感兴趣,则进行转发

2020-06-12 12:19:44 367

原创 常见的设计模式之策略模式

概念策略模式(Strategy Pattern),也叫政策模式(Policy Pattern),在策略模式中一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。策略模式一般主要包含三个角色:上下文(Context):用来操作策略的上下文环境,屏蔽客户端对策略、算法的直接访问,封装可能存在的变化抽象策略(Strategy):规定策略或算法的行为具体策略(ConcreteStrategy):策略或算法的具体实现实现接下来以支付方式场景为例1.创建抽象策略public a

2020-06-11 16:24:24 244

原创 常见的设计模式之工厂模式

概念工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。简单工厂模式简单工厂模式(Simple Factory Pattern)是指由一个工厂对象决定创造出哪一种产品的实例类,但它不属于GOF23种设计模式。1.创建接口public interface ICourse { public voi

2020-06-10 15:30:38 324

原创 常见的设计模式之代理模式

概念代理模式(Proxy Pattern)是指为其他对象提供一种代理,以控制对这个对象的访问。这种类型的设计模式属于结构型模式代理模式一般包含三个角色:抽象主题角色:主要职责是声明真实主题与代理的共同接口方法,该类可以是接口也可以是抽象类真实主题角色:该类也被称为被代理类,该类定义了代理所表示的真实对象,是负责执行系统真正的逻辑业务对象代理主题角色:也被称为代理类,其内部持有真实主题角色的引用,因此具备完全的对真实主题角色的代理权。客户端调用代理对象的方法,同时也调用被代理对象的方法。分类

2020-06-09 15:41:21 315

原创 常见的设计模式之单例模式

概念单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。常见写法1.饿汉式单例在单例类首次加载时就创建单例public class HungerSingleton{ private static final HungerSingleton

2020-06-08 18:21:25 874

原创 悲观锁和乐观锁

悲观锁概念总是假设最坏的情况,每次去拿数据的时候都认为被人会修改,所以每次去拿数据的时候都会上锁。多用于多写的情况实现java中synchronize和ReentrantLock等独占锁及时悲观锁思想的实现乐观锁概念总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。多用于多读的情况,提高吞吐量实现使用版本号机制和CAS算法实现版本号机制一般是在数据库表中添加一个数据版本号version字段,表示数据更新的

2020-06-07 15:22:43 199

原创 深入理解CyclicBarrier

引言jdk1.5开始,引入了一个类java.util.concurrent.CyclicBarrier用来控制多个线程互相等待,只有当多个线程都到达时,这些线程才会继续执行。与CountDownLatch不同的是,CyclicBarrier实例是可以重复使用的,也被称为重复栅栏使用class CyclicBarrierAgainDemo implements Runnable{ @Override public void run() { System.out.print("

2020-06-06 17:55:51 325

原创 深入理解线程池

什么是线程池线程是一种昂贵的资源,其主要开销分为以下几个方面:线程的创建和启动的开销线程销毁的开销线程调度的开销。线程的调度会导致上下文切换,从而增了了处理器资源的消耗因此,我们需要一种有效的使用线程的方式,线程池就是一种常见的方式。线程池的优势降低创建线程和销毁线程的性能开销提高响应速度,当有新任务需要执行是不需要等待线程创建就可以立马执行合理的设置线程池大小可以避免因为线程数超过硬件资源瓶颈带来的问题线程池的使用线程池在java中是如何实现的呢?在 JDK 1.5 之后推

2020-06-05 16:48:52 275

原创 深入理解ConcurrentHashMap(JDK8)

前言前面我们讲了HashMap的源码,知道HashMap是线程不安全的。今天我们就来讲一讲在JUC( java.util.concurrent)并发包中线程安全的HashMap-----ConcurrentHashMap想了解HashMap源码的同学可以去看之前的文章链接: 深入理解HashMap(JDK8)ConcurrentHashMap源码注意:我会把源码中每个方法的作用都注释出来,可以参考注释进行理解。put() final V putVal(K key, V value, b

2020-06-04 19:47:02 580

原创 深入理解HashMap(JDK8)

什么是Hash表Hash表,也叫散列表,是一种重要的数据结构,这种数据结构提供了Key和Value的映射关系。时间复杂度接近于O(1)Hash函数Hash表的本质也是一个数组,那它是怎么把key转换成数组的下标的呢?这里,就通过Hash函数将Key和数组下标进行转换。如图:Hash冲突由于数组的长度是有限的,当插入的entry越来越多时,两个不同的元素,通过hash函数获得的下标相同的概率就会越来越大,这种两个下标相同的情况就叫做Hash冲突Hash冲突解决办法开放寻址法:也叫线性探索。如

2020-06-03 21:16:13 450

原创 深入理解CountDownLatch

概念CountDownLatch可以用来实现一个或者多个线程等待其他线程完成一组特定的操作之后才能继续运行。这组操作被称为先决操作使用public static void main(String[] args) throws InterruptedException { CountDownLatch countDownLatch=new CountDownLatch(2); new Thread(()->{ System.out.println(Thread.c

2020-06-02 20:21:52 496

原创 深入理解条件变量Condition

概念Condition是JDK1.5引入的新的标准库java.util.concurrent.locks.Condition接口。Condition接口可作为wait/notify的替代品来实现等待/通知,它为解决过早唤醒问题提供了支持,并解决了Object.wait(long)不能区分返回是否是由于等待超时导致的问题。Condition实例可以通过Lock.newCondition()来获取,也就是说任意一个显示锁实例的newCondition方法都可以获得一个Condition实例。而Objec

2020-06-01 15:26:00 665

原创 深入理解ReentrantLock

锁的分类按照Java虚拟机对锁的实现方式划分,Java平台中锁可分为内部锁和显示锁内部锁:也被称为监视器锁,是一种排他锁,也就是独占锁,是通过synchronized关键字实现,在我们之前 深入理解synchronized关键字文章中有详细分析显示锁:自jdk1.5开始引入的排他锁,是通过java.concurrent.locks.Lock接口的实现类,起作用与内部锁相同。它提供了一些内部锁不具备的特性。但并不是内部锁的替代品LockLock接口的实现类:ReentrantLock:重入锁

2020-05-30 19:21:57 533 2

原创 深入理解ThreadLocal

ThreadLocal是什么?ThreadLocal实例为每一个访问它的线程(即当前线程)都关联了一个该线程的线程特有对象线程特有对象(TSO,Thread Specific Object):各个线程创建各自的实例,一个实例只能被一个线程访问的对象就被称为线程特有对象,相对应的线程就被称为该线程特有对象的持有线程ThreadLocal的使用static ThreadLocal<Integer> local = new ThreadLocal<Integer>() {

2020-05-29 18:15:14 340 2

原创 深入理解volatile 关键字

一个可见性问题引发的思考我们下来看一段代码:public static boolean flg =false; public static void main(String[] args) throws InterruptedException { Thread thread=new Thread(()->{ int i=0; while (!flg){ i++;

2020-05-28 18:40:54 334

原创 深入理解synchronized关键字

一个问题引发的思考public class App { public static int count=0; public static void incr(){ try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } count++; } public

2020-05-27 20:36:51 427

原创 线程的生命周期及五种基本状态

线程的创建1. 继承Thread类特点:编写简单,如果需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this即可获得当前线程。public class TestDemo extends Thread{ @Override public void run() { //线程会执行的指令 System.out.println("Come in"); } public static void main(St

2020-05-26 18:57:24 1084

原创 Mybatis的缓存机制

使用作为目前最常用的ORM框架之一,mybatis同样拥有提高查询效率的缓存机制。同样,它的缓存使用起来也非常简单,只需在Mapper.xml文件下加入如下配置即可。默认情况下,缓存是开启的<cache type="org.apache.ibatis.cache.impl.PerpetualCache" size="1024" eviction="LRU" flushInterval="120000"

2020-05-25 15:06:34 222

原创 Mybatis的使用与工作原理

使用方法1.添加maven依赖<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.4-snapshot</version></dependency><!--test测试引用--><depe

2020-05-23 16:23:57 439

原创 MyBatis插件原理---分页插件PageHelper

使用方法1.添加Maven依赖<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.0.0</version></dependency>2.在 Mybatis-Config.xml中配置

2020-05-22 17:32:23 445

原创 Netty系列教程(一)IO与NIO

在学习netty之前,我们先来看看传统的IO编程是怎么实现服务端客户端之间通信的。IO编程你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能...

2019-02-27 17:51:34 328 1

查看代码汇编指令工具.rar

按照配置方法说明配置完成后,在运行代码前,加入说明参数即可在代码运行时查看到代码的汇编指令

2020-06-02

程序猿心形表白源码

内含三个表白页面源代码。

2018-12-10

空空如也

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

TA关注的人

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