自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Mac下iterm2终端安装rz和sz命令方法

1. 下载Iterm2下载地址:http://www.iterm2.cn/download2. 安装rz、sz命令这里采用brew安装brew install lrzsz查看安装路径(以后有用)brew list lrzsz3. 编写启动脚本编写接收脚本 iterm2-recv-zmodem.sh,注意 rz 命令的位置,这里是在 /usr/local/Cellar/lrzsz/0.12.20_1/bin/rz 路径下。#!/bin/bashosascript -e 'tell ap

2021-12-01 14:04:55 1771

原创 高效获取群离线消息技术方案选型及数据库设计方案

问题探讨群离线消息推模式还是拉模式?如何高效存储每个群成员的群离线消息?如何保证多个群、大数据量群消息安全送达?架构演化起始方案群成员表: 存储群成员信息,即一个群有多少成员。// 群ID , 用户IDmt_group_user( group_id , user_id )群离线消息表: 存储每个群成员上线时需要拉去的群离线消息// 消息ID , 所属群ID, 用户ID, 消息发送者用户ID , 消息时间 , 消息内容mt_group_offine_message( messa

2020-12-26 23:50:27 406

原创 MySQL事务隔离级别、并发事务问题与MVCC机制原理

1. 事务的四大特性(ACID)原子性(Atomicity):事务是最小的执行单元,不允许分割。原子性保证了动作要么全完成,要么全不完成。一致性(Consistency):事务执行成功后,数据库从一个正确的状态变化到另一个正确的状态。隔离型(Isolation):并发访问数据库时,一个事务不被其他事务所干扰,各并发事务之间数据独立。持久性(Durability):一个事务提交之后,对数据库的改变是持久的。2. 并发事务带来的问题赃读(Dirty read):事务1读取了事务2修改但还为提交

2020-10-12 19:23:39 401

原创 JUC中Atomic包6种原子类使用详解及原理源码分析,看这一篇文章就够了

6类原子类原子类类型JUC的atomic归类Atomic*基本原子类AtomicIntegerAtomicLongAtomicBooleanAtomic*Array数组类型原子类AtomicIntegerArrayAtomicLongArrayAtomicReferenceArrayAtomicReference引用类型原子类AtomicReferenceAtomicStampedReference AtomicMarkableReferenceAtomicFi

2020-08-25 11:50:19 645

原创 Java中共享锁(读锁)与排它锁(写锁)

概念共享锁:允许多个线程共同持有一把锁,又称读锁,多个线程可以同时获取读锁。排它锁:只允许一个线程持有锁,又称写锁,只有一个线程可以获取写锁。读写锁规则总结:读写锁只是一把锁,只是有两种锁定方式。要么有一个线程获取写锁,要么有一个或多个线程获取读锁,两个不会同时出现(要么多读,要么一写)。读写锁的插队策略如果是公平锁,读、写锁都不允许插队,如果前面有等待线程,直接进行排队。如果是非公平锁。写锁可以随时插队尝试,拿不到锁进行排队。读锁在等待线程队列头结点不是写锁时可以插队,否则直接进

2020-08-17 21:49:53 850

原创 ReentrantReadWriteLock核心源码分析

ReentrantReadWriteLock内部类ReentrantReadWriteLock读写锁的性质是可重入锁只是一把锁,只是有两种锁定方式。要么有一个线程获取写锁,要么有一个或多个线程获取读锁,两个不会同时出现(要么多读,要么一写)。公平锁与非公平锁的插队策略如果是公平锁,读、写锁都不允许插队,如果前面有等待线程,直接进行排队。如果是非公平锁。写锁可以随时插队尝试,拿不到锁进行排队。读锁在等待线程队列头结点不是写锁时可以插队,否则直接进行排队。允许降级(持有写锁再次

2020-08-17 21:48:22 96

原创 最新版chrome浏览器安装crx插件时出现“CRX-HEADER-INVALID“解决方法

现象:解决:1、将.crx后缀改为.zip后缀。2、使用eZip软件解压文件。eZIp软件官方下载地址3、解压后点击加载已解压的扩展程序,选中安装即可。

2020-08-17 21:46:09 198

原创 解决Mac苹果电脑没有声音,喇叭会显示为灰色禁用状态

现象原因一般链接双显示器后,会将音频输出到另一个显示器,但是另一个显示没有音响,所以造成了不声音禁用的情况。解决系统偏好设置 -》 声音 -》 输出 -》修改为对应的音频输出即可。...

2020-08-17 21:45:40 5894 1

原创 Java中公平锁与非公平锁

公平锁与非公平锁的区别所谓公平锁,即新加入的线程会按照尝试获取锁的先后顺序依次拿到锁。所谓非公平锁,即新加入的线程会进行lock方法加锁进行CAS尝试,加锁失败之后tryAcquire方法state为0时候还会进行加锁尝试,而公平锁lock加锁不会尝试,tryAcquire方法state为0时候并且前面没有线程队列排队的时候才会进行加锁尝试。非公平锁的线程加锁会先进行CAS操作尝试获取锁,而公平锁直接进行后续操作。实现即重写抽象类Sync的lock方法的不同。非公平锁如果state状态为0就尝试加

2020-08-17 21:44:01 219

原创 ReentrantLock核心源码分析

ReentrantLock核心源码分析:ReentrantLock核心原理采用AQS原理实现。ReentrantLock实现可重入锁核心原理:公平锁与非公平锁的区别所谓公平锁,即新加入的线程会按照尝试获取锁的先后顺序依次拿到锁。所谓非公平锁,即新加入的线程会进行lock方法加锁进行CAS尝试,加锁失败之后tryAcquire方法state为0时候还会进行加锁尝试,而公平锁lock加锁不会尝试,tryAcquire方法state为0时候并且前面没有线程队列排队的时候才会进行加锁尝试。Ree

2020-08-17 21:41:34 159

原创 Java中可重入锁与不可重入锁

可重入锁概念同一个线程中可多次获取同一把锁,无需等待其锁释放。如ReentrantLock,synchronized等。使用示例import java.util.concurrent.locks.ReentrantLock;/** * @author weilai * @email 352342845@qq.com * @date 2020/3/23 12:58 下午 */public class DemoLock { public static ReentrantLock

2020-08-17 21:40:32 241

原创 Java中乐观锁与悲观锁,即互斥同步锁与非互斥同步锁

乐观锁又叫非互斥同步锁,悲观锁又叫互斥同步锁。悲观锁的劣势阻塞和唤醒带来的性能开销。永久阻塞问题。如果持有锁的线程发生无限循环或者死锁等活跃性的问题,那么等待获取锁执行的线程将无法执行。优先级反转问题。如果我们设置了优先级,当优先级高的线程需要等待优先级低的线程锁的时候,会让线程的优先级反转。悲观锁概念持悲观态度,认为每次执行这个同步资源的时候都会有线程争抢这个资源,如果不锁住就会发生错误。所以每次执行时都会锁住,让其他人等待执行完成释放锁后在拿到锁再执行。如synchronized和Loc

2020-08-17 21:39:17 412

原创 JUC中Executors工具类使用创建线程池、线程工厂、Runnable转Callable等

创建ThreadPoolExecutor线程池newSingleThreadExecutor: 单线程池只有一个线程的线程池,只用一个线程来执行任务,保证任务按FIFO( First Input First Output,简单说就是指先进先出)顺序一个个执行,保证执行顺序。使用无限队列可能会导致OOM。public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorSer

2020-08-17 21:38:43 130

原创 ExecutorService线程池的创建、钩子、销毁等相关操作

创建线程池执行说明图解步骤1、创建线程池对线时候不会创建线程,当有第一个线程任务时,才会创建线程。2、如果线程数少于核心线程数时,当有新的线程来,不管之前的线程是否空闲,都会继续创建新的线程,直到达到核心线程数。3、当线程数等于核心线程数时,当有新线程来,先放入任务队列中等待核心线程执行完毕之后取出任务队列中任务执行,直到线程队列达到最大容量。4、当线程数大于队列最大容量时候,会创建非核心线程来执行任务,直到达到最大线程数(maximumPoolSize)。5、当线程数等于最大线程数时,

2020-08-05 18:15:09 2620

原创 Flutter中iOS报错Trying to embed a platform view but the PrerollContext,PaintContext does not support em

Flutter中异常处理:[VERBOSE-2:platform_view_layer.cc(20)] Trying to embed a platform view but the PrerollContext does not support embedding[VERBOSE-2:platform_view_layer.cc(37)] Trying to embed a platform view but the PaintContext does not support embedding在

2020-08-05 18:14:04 390

原创 IP地址、子网掩码、网络号、主机号、网络地址、主机地址运算

子网掩码子网掩码:用来标记有多少位是网络号(1)、多少位是主机号(0)。例子:255.255.255.0 二进制是:11111111 11111111 11111111 00000000网络号24位。主机号位8位。172.16.10.33/27 中的/27也就是说子网掩码是255.255.255.224 即27个全1 ,11111111 11111111 11111111 11100000。根据IP地址和子网掩码求网络地址和广播地址:说明原始二进制IP192.168.12

2020-08-05 18:13:27 4240

原创 Java线程等待中Thread.sleep()、Object.wait()、LockSupport.park、UNSAFE.park()的原理与区别

Thread.sleep()源码如下:public static native void sleep(long millis) throws InterruptedException;public static void sleep(long millis, int nanos) throws InterruptedException { if (millis < 0) { throw new IllegalArgumentException("timeout value is ne.

2020-08-05 18:12:25 1139

原创 Java中InheritableThreadLocal原理源码分析

如果对ThreadLocal不了解的,请阅读理解ThreadLocal原理分析及内存泄漏问题ThreadLocal与InheritableThreadLocal都是创建线程私有变量,ThreadLocal绑定的是当前线程,如果希望当前线程的ThreadLocal能够被子线程使用,那么我们需要使用InheritableThreadLocal。简介:InheritableThreadLocal类的实现非常简单,直接继承了ThreadLocal类,并重写类其中的三个方法。源码如下:public class

2020-08-05 18:11:20 97

原创 Java JDK1.6对Synchronized锁优化引入锁膨胀、锁消除、锁粗化、自旋锁、偏向锁、轻量级锁、重量级锁详解

monitor原理及执行步骤因为每个对象头中都存在monitor锁对象,所以java中可以用对象加锁。对象结构大概分为对象头、实例变量和填充字节。对象头Mark Word(标记字段):存储对象的hashCode、锁信息或分代年龄或GC标志等信息Klass Pointer(类型指针):对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例数组长度:只有数组对象保存了这部分数据。该数据在32位和64位JVM中长度都是32bit。实例变量:实例数据部分是对象真正存储的有效

2020-08-05 18:10:47 327

原创 Java synchronized底层原理与底层锁优化

synchronized发生异常会自动释放锁在 Java 早期版本中,synchronized属于重量级锁,效率低下,因为监视器锁(monitor)是依赖于底层的操作系统的 Mutex Lock 来实现的,Java 的线程是映射到操作系统的原生线程之上的互斥锁来实现的。如果要挂起或者唤醒一个线程,都需要操作系统帮忙完成,而操作系统实现线程之间的切换时需要从用户态转换到内核态,这个状态之间的转换需要相对比较长的时间,时间成本相对较高,这也是为什么早期的 synchronized 效率低的原因。庆幸的是在 J

2020-07-27 19:02:48 116

原创 Spring Aop Pointcut切点表达式

通配符*: 匹配任意数量的字符+:匹配制定数量的类及其子类…:一般用于匹配任意数量的子包或参数指示器(Designators)1 execution()格式:execution( modifier-pattern? //修饰符 ret-type-pattern //返回类型 declaring-type-pattern? //方法模式 name-pattern(param-pattern) //参数模式 throws-pattern? //

2020-07-27 19:01:13 745

原创 redis持久化RDB与AOF原理简介、配置、从持久化中恢复数据

Redis为持久化提供了两种方式:RDB:在指定的时间间隔能对你的数据进行快照存储。AOF:记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据。1、AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾.Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大。2、同时开启两种持久化方式, 在这种情况下, 当redis重启的时候会优先载入AOF文件来恢复原始

2020-07-27 19:00:20 293 1

原创 Java中ThreadLocal使用原理源码分析及内存泄漏问题

ThreadLocalThreadLocal简介通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。如果想实现每一个线程都有自己的专属本地变量该如何解决呢? JDK中提供的ThreadLocal类正是为了解决这样的问题。 ThreadLocal类主要解决的就是让每个线程绑定自己的值,可以将ThreadLocal类形象的比喻成存放数据的盒子,盒子中可以存储每个线程的私有数据。如果你创建了一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的本地副本,这也是ThreadLoca

2020-07-27 18:57:57 173

原创 Java中ConcurrentHashMap(JDK1.7)源码学习

1. 原理结构2. 源码分析2.1 属性说明2.2 构造函数2.3 put方法初始化Segment对象调用Segment中的put方法2.4 get方法2.5 remove方法通过hash值获取Segment对象调用Segment对象中的remove方法1. 原理结构原理采用分段锁来实现线程安全,首先将数据分为一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据时,其他段的数据也能被其他线程访问。ConcurrentHashMap ..

2020-07-26 14:42:23 67

原创 Java中HashMap(JDK1.8)源码学习

1. HashMap 简介2. 底层数据结构分析2.1 JDK1.8之前2.2 JDK1.8之后3. HashMap源码分析3.1 构造方法3.2 put方法与1.7的区别添加逻辑分析源码分析3.3 get方法3.4 resize方法如果对红黑树还不了解,请点击查看彻底理解红黑树及JDK1.8TreeMap源码分析1. HashMap 简介HashMap 主要用来存放键值对,它基于哈希表的Map接口实现,是常用的Java集合之一。JDK1.8 之前 H..

2020-07-26 14:41:07 62

原创 Java中HashMap(JDK1.7)源码学习

1. 简介1.1 类定义1.2 相关介绍2. 数据结构2.1 具体描述2.2 拉链法示意图2.3 存储流程2.4 数组元素&链表节点的实现类3. 源码分析3.1 属性说明3.2 构造函数3.3 put方法初始化哈希表key为空时添加值计算key的哈希值计算数组下表判断是否需要扩容并调用增加元素方法数组扩容逻辑旧数组数据转移到新扩容数组上实际增加逻辑3.4 get方法获取key为null处的值循环对应数组下标处的链表获取key处的E..

2020-07-26 14:38:25 97

原创 Java中LinkedList源码学习

简介内部结构分析核心方法LinkedList源码分析构造方法添加(add)方法根据位置取数据的方法根据对象得到索引的方法检查链表是否包含某对象的方法:删除(remove/pop)方法简介LinkedList是一个实现了List接口和Deque接口的双端链表。LinkedList底层的链表结构使它支持高效的插入和删除操作,另外它实现了Deque接口,使得LinkedList类也具有队列的特性;LinkedList不是线程安全的,如果想使LinkedList变成线程安全的..

2020-07-26 14:37:53 95

转载 Java中ArrayList源码学习

ArrayList简介ArrayList核心源码ArrayList源码分析System.arraycopy()和Arrays.copyOf()方法两者联系与区别ArrayList核心扩容技术内部类ArrayList经典DemoArrayList简介ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增长。在添加大量元素前,应用程序可以使用ensureCapacity操作来增加 ArrayList 实例的容量。这可以减少递增式再..

2020-07-26 14:37:21 47

原创 Nginx做反向代理之后,访问项目跳转到localhost或者127.0.0.1

现象配置了proxy_redirect off之后还会跳转到pass路由。location / { proxy_pass http://127.0.0.1:8085; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwa

2020-07-26 14:36:48 28069

原创 java中的fail-fast(快速失败)机制

迭代器没有修改modCount而foreach修改的modCount,导致抛出ConcurrentModificationException异常。fail-fast 机制即快速失败机制,是java集合(Collection)中的一种错误检测机制。当在迭代集合的过程中该集合在结构上发生改变的时候,就有可能会发生fail-fast,即抛出ConcurrentModificationException异常。fail-fast机制并不保证在不同步的修改下一定会抛出异常,它只是尽最大努力去抛出,所以这种机制一般仅

2020-07-26 14:32:37 109

原创 Java中ArrayList的扩容机制

ArrayList 的扩容机制先从 ArrayList 的构造函数说起ArrayList有三种方式来初始化,构造方法源码如下: /** * 默认初始容量大小 */ private static final int DEFAULT_CAPACITY = 10;private static final Object[] EMPTY_ELEMENTDATA = {}; private static final Object[] DEFAULTCAPACITY_EM

2020-07-26 14:30:16 157

原创 java强引用、软引用、弱引用、虚引用的概念理解

基本概念从Java SE2开始,就提供了四种类型的引用:强引用、软引用、弱引用和虚引用。Java中提供这四种引用类型主要有两个目的:第一是可以让程序员通过代码的方式决定某些对象的生命周期;第二是有利于JVM进行垃圾回收。下面来阐述一下这四种类型引用的概念:1、强引用(StrongReference)强引用就是指在程序代码之中普遍存在的,比如下面这段代码中的object和str都是强引用: Object object = new Object();String str = "hello";只

2020-07-26 14:28:03 119

原创 树、二叉树、二叉搜索树(二叉查找树)

1 树1.1 定义结合图看,可以比较直观地发现,树(Tree)是元素的集合,每棵树由多个节点(node)组成,用以储存元素。某些节点之间存在着一定的关系,用连线表示,连线称为边(edge)或者链接。边的上端点成为父节点,下端称为子节点。最上边的节点为根节点(S节点)。没有子节点的节点则称为叶子节点或叶节点(A、R、X 节点)。父节点是一个节点,所以它们被称为兄弟节点(E、X节点)。每个节点可以有多个子节点,而该节点则是相应子节点的父节点。但是每个节点只能有一个父节点(只有一个例外,也就是根节点,它没有

2020-07-26 14:27:24 208

原创 平衡二叉树(AVL树)

定义平衡二叉树是一种二叉排序树,其中每一个结点的左子树和右子树的高度差至多等于1。平衡二叉树的前提是一棵二叉排序树,二叉排序树的查找性能受树的形状影响较大,所以需要对二叉排序树进行平衡处理,常见的方法有AVL、红黑树、Treap等。平衡因子平衡二叉树上的结点左子树的深度减去右子树的深度的值成为该结点的平衡因子,平衡因子取值只能为0,-1,1。最小不平衡子树距离插入结点最近的,且以平衡因子的绝对值大于1的结点为根结点的子树。平衡二叉树的平衡过程RR型旋转:插入结点在最小不平衡子树的左子树的左

2020-07-26 14:26:41 177

原创 彻底理解红黑树及JavaJDK1.8TreeMap源码分析

1. 定义2. 节点称呼3. 性质4. 红黑树的自平衡4.1 左旋4.2 右旋4.3 变色4.4 总结5. 红黑树的查找6. 红黑树的插入6.1 查找插入位置6.2 插入的自平衡7. 红黑树删除7.1 查找删除位置7.2 删除结点7.3 删除后的自平衡红黑树红黑树理解动画地址为https://rbtree.phpisfuture.com1. 定义红黑树也是二叉查找树,我们知道,二叉查找树这一数据结构并不难,而红黑树之所以难是难在它是自平衡的二叉查找树..

2020-07-26 14:25:21 136

原创 红黑树动画在线演示

红黑树动画在线演示https://rbtree.phpisfuture.com/

2020-02-15 19:18:30 1738

空空如也

空空如也

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

TA关注的人

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