自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 收藏
  • 关注

原创 设计模式(一):记一次观察者模式+简单工厂方法模式的实现

一、基本概念观察者模式(Observer),又叫发布-订阅模式,定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。简单工厂模式(Static Factory Method),定义一个工厂类,他可以根据参数的不同返回不同类的实例二、观察者模式实现(1)举例假设上班时间,有一部分同事上班时间有一部分同事在看股票,一部分同事在看NBA,这时老板回来了,前台通知了部分同事老板回来了,这些同事及时关闭了网页没被发现,而没被通知到的同事被抓了个现行,被老板亲

2020-07-29 17:32:47 531

原创 redis常见问题

1.为什么redis这么快(1)完全基于内存,绝大部分请求都是纯粹的内存操作,非常快速。数据存在内存中,类似于hashmap这种,查询和操作的时间复杂度都是O(1)(2) 采用单线程的,避免了不必要的上下文切换和竞争条件。也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗(3)使用了多路I/O复用模型,非阻塞I...

2020-04-25 23:51:02 295

原创 记录一下面试遇到的难点

1.mysql,怎么删除表中重复的数据(保留一条,并对某字段加上唯一索引alert ignore table user add UNIQUE index(‘user_id’)2.rabbitMQ,消费者报异常了该怎么办,如何重试、重发RabbitMQ默认是自动确认的,也就是消费者消费到消息之后,MQ自动帮我们ACK,然后把队列里的消息删除所以需要开启手动ACK机制,在你的监听方法上,加入A...

2020-04-24 10:36:45 296

原创 记一次新东方Java的面试经历

1.自我介绍2.项目中遇到的难点,以及如何解决(讲了redis,cobar,)3.jvm一次完整的GC流程4.栈内存溢出的情形5.ArrayList和LinkedList的区别6.在jvm层面,数组和链表有什么区别。7.在数据结构上,栈和队列有什么区别8.hashMap的实现原理,链表是头插法还是尾插法9.常用过的并发包,并根据源码讲一下实现原理10.sleep()和wait()...

2020-03-29 20:20:38 1425 1

原创 记录一次快手的远程面试经历(一面)

1.自我介绍2.项目介绍(哪些业务+技术栈)3.限频设计4.令牌桶和漏桶的区别5.算法:如何判断一个树是不是平衡二叉树6.调度线程池源码7.线程池addWork,runWork实现原理...

2020-03-26 18:32:22 1476 1

原创 消息队列(MQ)随笔

此篇文章为个人笔记,记录下能想到的消息队列相关问题1.为什么要用MQ三点:解耦、异步、削峰。具体说说:(1)解耦:解除耦合,比如在一个需求中一个系统A,需要发数据给B、C、D系统。后来由于需求变动,C不需要这个数据了,我们就需要你去改A系统的代码。然后过了几天A又需要给E系统发数据,又需要改A代码。耦合度很高。这个时候就需要引入消息队列的概念,只需要A系统配置好消息生产者,BCDE系统可以...

2020-02-29 22:07:35 257 1

原创 记一次基于Redis分布式锁的实现(频次限制)

一、需求酒店资源系统,在下单和查询报价的时候,会调用第三方供应商系统。因用户较多,订单量较大、QPS较高的背景,所以资源系统采用集群部署方式,部署了12台机器,使用nginx做负载均衡,均匀打在每个节点上。但是,为了系统性能因素,供应商接口添加了频次限制,每分钟不能超过2000次。二、需求分析资源系统一分钟之内,所有的服务节点加起来的调用供应商接口请求数不能超过2000。如果是单节点的话...

2020-02-24 19:34:07 1955

原创 JVM原理(四):JVM调优

一、JVM调优的目的主要目的就是降低minor Gc的频率,以及减少Full Gc的次数二、JVM调优常用参数堆参数:-Xms4800M:堆初始内存大小-Xmx4800M:堆最大内存大小-Xmn1800M:新生代内存大小-XX:PermSize:永久代(方法区)的初始内存大小-XX:NewPermSize:永久代(方法区)的最大内存大小-XX:NewRatio:年老代和年轻代的...

2020-02-22 18:18:32 185

原创 Mysql索引底层实现原理

一、定义索引(index)是帮助Mysql高效获取数据的数据结构。所以,索引的本质的数据结构。二、设计原理为什么要使用索引,很容易想到的目前就是加快查询效率。因此数据库的设计者会从查询算法的角度上开始优化。最基本的查询算法也就是顺序查找,这样的时间复杂度为O(n)的算法在数据量非常大的情况下显示是糟糕的。随着计算机科学技术的发展,例如二分查找(binary search)、二叉树查找(bi...

2020-02-18 17:54:11 414

原创 sql优化技术整理

1.禁止使用select * ,需要哪些字段查哪些字段2.使用select in ()的时候,如果存在子查询,使用exist 代替in如果连接列id 上有索引,那么查询CLASS_B时,无需查询实际表,仅需要查索引就可以了。使用exists ,那么只有查到一行数据满足条件就会终止查询,不会产生临时表。使用in查询时,数据库首先会执行子查询,然后将结果保存在临时表中,然后扫描整个临时表,很...

2020-02-17 22:16:27 472

原创 JVM原理(三):垃圾回收

1

2020-02-17 21:20:08 969

原创 JVM常用参数

-XX:MaxTenuringThreshold 新生代晋升年老代阈值-Xms设置堆的最小空间大小。-Xmx设置堆的最大空间大小。-Xmn:设置年轻代大小-XX:NewSize设置新生代最小空间大小。-XX:MaxNewSize设置新生代最大空间大小。-XX:PermSize设置永久代最小空间大小。-XX:MaxPermSize设置永久代最大空间大小。...

2020-02-16 22:31:33 73

原创 JVM原理(二):HotSpot 虚拟机对象

本文将详细的梳理一下 HotSpot 虚拟机在 Java 堆中对象分配、布局以及如何访问的全过程。一、Java对象的创建过程

2020-02-16 22:24:20 79

原创 JVM原理(一):JVM内存模型

一、基本概念JVM,Java Virtual Machine(即Java虚拟机),是一种用于计算设备的规范,它是一个虚构出来的计算机。二、JVM内存模型2.1 运行时内存区域Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域(1)jdk1.8之前:jdk1.8之后:方法区变成了元空间2.2 内存区域划分和基本概念:线程间公有的:堆、方法区(...

2020-02-15 16:53:01 270

原创 AQS原理应用(三):信号量Semaphore的使用方法

一、基本概念Semaphore,同样是实现AbstractQueuedSynchronizer(AQS)接口。不同于synchronized 和 ReentrantLock 都是一次只允许一个线程访问某个资源,Semaphore(信号量)可以指定多个线程同时访问某个资源。二、使用方法public class SemaphoreTest { // 请求的数量 private stat...

2020-02-13 20:55:22 187

原创 AQS原理应用(二):CyclicBarrier的使用方法和源码分析

一、基本概念CyclicBarrier:循环栅栏,是一个同步工具类。可以用于多线程计算数据,最后合并计算结果的应用场景 。 比如我们用一个 Excel 保存了用户所有银行流水,每个 Sheet 保存一个帐户近一年的每笔银行流水,现在需要统计用户的日均银行流水,先用多线程处理每个 sheet 里的银行流水,都执行完之后,得到每个 sheet 的日均银行流水,最后,再用 barrierAction ...

2020-02-12 22:48:55 177

原创 AQS原理应用(一):CountDownLatch的典型用法和实现原理

一、基本概念CountDownLatch 是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。二、CountDownLatch 的三种典型用法(1) 某一线程在开始运行前等待 n 个线程执行完毕。将 CountDownLatch 的计数器初始化为 n :new CountDownLatch(n),每当一个任务线程执行完毕,就将计数器减 1 countdownla...

2020-02-12 00:01:19 552 1

原创 对AQS原理的理解以及ReentantLock 源码理解

一、AQS的含义AQS,全程AbstractQueuedSynchronizer,这个类在 java.util.concurrent.locks 包下面。AQS是一个用来构建锁和同步器的框架。使用 AQS 能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的 ReentrantLock,Semaphore,其他的诸如 ReentrantReadWriteLock,SynchronousQ...

2020-02-11 16:41:06 310

原创 new一个对象的过程

看一行代码Singleton instance = new Singleton();在编译这行代码的时候,JVM实际上会分为三个步骤:Singleton instance(1)声明一个引用变量instance :告诉编译器声明一个instance 这样的Singleton 类型的引用变量,其价值将待定,直到有一个对象真正被创造和分配给它。此时只是简单的声明了一个引用变量,没有指向任何...

2020-02-09 23:17:48 542 1

原创 ThreadLocal的使用方法和底层原理

一、ThreadLocal简介ThreadLocal的概念,顾名思义:本地线程,实现每一个线程都有自己的专属本地变量。通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。如果想实现每一个线程都有自己的专属本地变量该如何解决呢? JDK中提供的ThreadLocal类正是为了解决这样的问题。ThreadLocal类主要解决的就是让每个线程绑定自己的值,可以将ThreadLocal类形象的...

2020-02-09 22:45:18 925

原创 volatile关键字的底层原理

一、volatile的官方定义Java语言规范第三版中对volatile的定义如下:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了Volatile,在某些情况比synchronized更方便。如果一个变量被声明为volatile的,java内存模型确保所有线程看到这个变量的值是一致的。二、volatile的...

2020-02-08 23:57:13 907

原创 Redis知识整理(二):结合源码讲一下Spring集成Redis的两种方式:Jedis和RedisTemplate

一、Redis简介Redis是一种非关系型(K-V)数据库,也叫做缓存数据库,类似于Memcached ,但有着以下优点:(1)Redis不仅仅支持简单的字符串类型的K-V数据,还支持hash 、list、set、zset等多种数据类型。(2)Redis支持 master-slave(主—从)模式应用,memcache 支持分布式(3)Redis支持数据的备份,即master-slave模...

2020-02-08 16:18:50 880

原创 synchroniezd 关键字的使用方法和底层原理

一、对synchronized的理解synchronized,是java的关键字,使用它可以来修饰对象实例、代码块、方法和类,使其保证再任意时刻只能被一个线程访问。二、使用方法synchronized的最主要的三种使用方法(1) 修饰同步代码块 :synchronized(this)或者synchronized(类实例对象),相当于给当前对象实例加锁(2)修饰实例方法 : ...

2020-02-06 23:32:06 893

原创 HashMap底层实现原理和源码分析

一、HashMap简介HashMap 主要用来存放键值对,它基于哈希表的Map接口实现,是常用的Java集合之一。JDK1.8 之前 HashMap 由 数组+链表 组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突).JDK1.8 以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)时,将链表转化为红黑树(将链表转换成红黑树前会...

2020-02-05 23:02:35 297

原创 TCP/IP 协议的三次握手和四次挥手

传输层控制协议TCP简介:面向连接的、可靠的基于字节流的传输层控制协议将应用层的的数据流分割成报文段并发送给目标节点的TCP层数据包都有序号(SEQ),对方收到则发送ACK确认,未收到则重传使用校验和来校验数据在传输中,是否有误进程间通信(1)实际上TCP的发送方和接收方是进程间的通信,而单机线程间通信可以用PID,而多台机器间通信没有PID的概念,并且单机中PID唯一,容易造成冲...

2020-02-04 12:28:28 142

原创 Java并发(一):Java线程池的基本使用方法和源码分析

一、基本概念1.线程和进程的概念线程:线程是CPU能过进行运算调度的最小单位进程:具有独立功能的程序在某个数据集合上的一次执行过程,是 系统进行资源调度和分配的基本单位线程池:本质上是对象池,用于管理线程资源。在任务执行前,从线程池中拿出线程来执行;在任务执行后,需要吧线程放回线程池。反复利用。线程的创建和执行的几种方式和源码分析在另外一篇博客中给出~2.为什么要使用线程池(1)降低...

2020-02-03 15:08:10 189 1

原创 Redis知识整理(一):缓存雪崩和缓存穿透的区别和解决方案

一、正常的缓存处理流程二、什么是缓存雪崩和缓存穿透缓存雪崩:指的是缓存中大量数据到达过期时间或者没有此数据,而数据查询量过大,导致数据库压力过大而宕机的情形。缓存穿透:指的是查询了很多缓存和数据库中都没有的数据,而用户不断的发起请求,比如id为“-1”,“999”,用户很有可能是黑客,数据查询量多大导致数据库压力过大而宕机的情形。二、如何解决缓存雪崩问题1.分析造成缓存雪崩的原因:(...

2020-01-31 00:10:39 473

原创 谈一谈数据库的分库分表

一、为什么要进行分库分表(1)解决高并发问题(2)数据库数据量过大二、拆分方式(1)垂直拆分,通常是把一个有很多字段的表给拆分成多个表,或者是多个库上去。每个库表的结构都不一样,每个库表都包含部分字段。一般情况下,会将较少的访问频率很高的字段放到一个表里去,然后将较多的访问频率很低的字段放到另外一个表里去。因为数据库是有缓存的,你访问频率高的行字段越少,就可以在缓存里缓存更多的行,性能就越...

2020-01-29 17:43:56 266

空空如也

空空如也

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

TA关注的人

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