Archived

「 34 」

  • 三月 2021

  • 三月 20, 2021
    JAVA 16新特性

    当我们还深陷 Java 8 版本之际,这边最新版本 Java 16 已经于3.16正式发布。与 Java 15 一样,作为短期版本,Oracle 仅提供 6 个月的支持。下面让我们来看看JDK16主要新特性吧。 Vector API(孵化)提升了Java在CPU向量计算的性能,这是对大规模的张量计算的支持,提升了Java在AI领域的能力。 启用了新的C++特性允许在JDK中C++源代码中使用...

  • 三月 19, 2021
    Hello hexo

    关于博客在老早以前,自己就有搭建一个博客的想法,中途也尝试自己动手操作过,但是好几次都半途而废了。在自己的想法中,一个博客需要一套管理系统,自己没那么多时间。最近在晚上搜寻的时候,发现了一个惊为天人的博客,其UI甚合我意,于是一番操作下发现了这个Hexo,以及那个深得我心的主题-obsidian。 Hexo Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown(或其他...

  • 一月 2021

  • 一月 20, 2021
    PAXOS的一些理解

    Paxos算法 Google Chubby的作者Mike Burrows说过这个世界上只有一种一致性算法,那就是Paxos,其它的算法都是残次品。Paxos:多数派决议(最终解决一致性问题) Paxos算法有三种角色:Proposer,Acceptor,Learner Proposer:提交者(议案提交者) 提交议案(判断是否过半),提交批准议案(判断是否过半) Acceptor:接收者...

  • 十二月 2020

  • 十二月 20, 2020
    docker安装

    1、Docker 要求 CentOS 系统的内核版本高于 3.10 ,通过 uname -r 命令查看你当前的内核版本。 $ uname -r 2、使用 root 权限登录 Centos。确保 yum 包更新到最新。 $ sudo yum update 3、卸载旧版本(如果安装过旧版本的话) $ sudo yum remove docker docker-common docker-s...

  • 十二月 05, 2020
    DirectByteBuffer原理探究

    DirectByteBuffer是Java用于实现堆外内存的一个重要类,通常用在通信过程中做缓冲池,如在Netty、MINA等NIO框架中应用广泛。DirectByteBuffer对于堆外内存的创建、使用、销毁等逻辑均由Unsafe提供的堆外内存API来实现。 构造函数下图为DirectByteBuffer构造函数,创建DirectByteBuffer的时候,通过Unsafe.allocat...

  • 十一月 2020

  • 十一月 10, 2020
    魔法类Unfase

    基本介绍如下Unsafe源码所示,Unsafe类为一单例实现,提供静态方法getUnsafe获取Unsafe实例,当且仅当调用getUnsafe方法的类为引导类加载器所加载时才合法,否则抛出SecurityException异常。 public final class Unsafe { // 单例对象 private static final Unsafe theUnsaf...

  • 十月 2020

  • 十月 21, 2020
    并发编程之伪共享

    Cache为了解决计算机系统中主内存与CPU之间运行速度差问题,会在CPU与主内存之间添加一级或者多级高速缓冲存储器(Cache)。在Cache内部是按行存储的,其中每一行称为一个Cache行。Cache行是Cache与主内存进行数据交换的单位,Cache行的大小一般为2的幂次数字节。 数据访问当CPU访问某个变量时,首先会去看CPU Cache内是否有该变量,如果有则直接从中获取,否则就去...

  • 十月 07, 2020
    前后端分离 , 如何保证接口安全性 ?

    服务端 HTTP 请求中的来源识别 数据加密 采用https协议,保障数据传输过程中的安全 数据签名 将要提交的数据,通过某种方式组合成一个字符串,然后通过 MD5 算法生成一个签名。如果觉得单纯的 MD5 不够安全的话,还可以在 MD5 的时候加盐和加 hash 。 时间戳 在参数中加上当前请求的时间戳,服务端拿到这个请求后会拿当前的时间和请求中的时间做比较,比如在 5 分钟之...

  • 九月 2020

  • 九月 21, 2020
    分布式事务相关

    CAP 定理CAP 定理指出对于一个分布式系统来说,不可能同时满足以下三点: 一致性 (Consistence): 等同于所有节点访问同一份最新的数据副本 (强一致性) 可用性 (Availability): 每次请求都能获取到非错的响应,但是不保证获取的数据为最新数据 分区容错性 (Partition tolerance): 系统中任意信息的丢失或失败不会影响系统的继续运作。 由 CA...

  • 九月 08, 2020
    RocketMQ事务消息

    分布式事务当前解决方案2PC 2PC 把事务的执行分为两个阶段,第一个阶段即 prepare 阶段,这个阶段实际上就是投票阶段,协调者向参与者确认是否可以共同提交,再得到全部参与者的所有回答后,协调者向所有的参与者发布共同提交或者共同回滚的指令,用以保证事务达到一致性。 2PC 是几乎所有分布式事务算法的基础,后续的分布式事务算法几乎都由此改进而来,其优缺点非常明显: 优点:在于已...

  • 八月 2020

  • 八月 15, 2020
    Zookeeper ZAB协议

    Zookeeper Automic Broadcast(ZAB),即Zookeeper原子性广播,是Paxos经典实现。 ZAB(zookeeper)中节点分四种状态 looking:选举Leader的状态(崩溃恢复状态下) following:跟随者(follower)的状态,服从Leader命令 leading:当前节点是Leader,负责协调工作。 observing:observer...

  • 五月 2020

  • 五月 28, 2020
    并发编程之公平、非公平锁

    公平锁公平锁是指多个线程按照申请锁的顺序来获取锁,线程直接进入队列中排队,队列中的第一个线程才能获得锁。公平锁的优点是等待锁的线程不会饿死。缺点是整体吞吐效率相对非公平锁要低,等待队列中除第一个线程以外的所有线程都会阻塞,CPU唤醒阻塞线程的开销比非公平锁大。 如上图所示,只有拿到锁的人才能够打水,每个过来打水的人都要管理员的允许并拿到锁之后才能去打水,如果前面有人正在打水,那么这个想要打...

  • 五月 15, 2020
    并发编程之Synchronized锁

    Java对象头synchronized是悲观锁,在操作同步资源之前需要给同步资源先加锁,这把锁就是存在Java对象头里的,Hotspot的对象头主要包括两部分数据:Mark Word(标记字段)、Klass Pointer(类型指针)。 Mark Word:默认存储对象的HashCode,分代年龄和锁标志位信息。这些信息都是与对象自身定义无关的数据,所以Mark Word被设计成一个非固定...

  • 四月 2020

  • 四月 10, 2020
    并发编程之自旋锁

    自旋锁阻塞或唤醒一个Java线程需要操作系统切换CPU状态来完成,这种状态转换需要耗费处理器时间。在许多场景中,同步资源的锁定时间很短,为了这一小段时间去切换线程,线程挂起和恢复现场的花费可能会让系统得不偿失。如果物理机器有多个处理器,能够让两个或以上的线程同时并行执行,我们就可以让后面那个请求锁的线程不放弃CPU的执行时间,看看持有锁的线程是否很快就会释放锁。 而为了让当前线程“稍等一下”...

  • 三月 2020

  • 三月 21, 2020
    并发编程之乐观锁、悲观锁

    乐观锁 VS 悲观锁Java中,synchronized关键字和Lock的实现类都是悲观锁。 而乐观锁认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据。如果这个数据没有被更新,当前线程将自己修改的数据成功写入。如果数据已经被其他线程更新,则根据不同的实现方式执行不同的操作(例如报错或者自动重试)。 乐观锁在Java中是通过...

  • 三月 08, 2020
    并发编程之volatile

    内存可见性问题我们首先来看看在多线程下处理共享变量时Java的内存模型: Java内存模型规定,将所有的变量都存放在主内存中,当线程使用变量时,会把主内存里面的变量复制到自己的工作空间或者叫作工作内存,线程读写变量时操作的是自己工作内存中的变量。 synchronized关键字synchronized块是Java提供的一种原子性内置锁,线程的执行代码在进入synchronized代码块前会...

  • 二月 2020

  • 二月 15, 2020
    并发编程之Happens-Before原则

    Happens-Before原则JVM定义的Happens-Before原则是一组偏序关系:对于两个操作A和B,这两个操作可以在不同的线程中执行。如果A Happens-Before B,那么可以保证,当A操作执行完后,A操作的执行结果对B操作是可见的。Happens-Before的规则包括: 程序顺序规则 锁定规则 volatile变量规则 线程启动规则 线程结束规则 中断规则 终结器规...

  • 一月 2020

  • 一月 28, 2020
    Spring之循环依赖的解决方案

    循环依赖就是循环引用,就是两个或者多个 bean 相互之间的持有对方,最后形成一个环。例如 A 引用了 B,B 引用了 C,C 引用了 A。 解决循环依赖原型(Prototype)的场景是不支持循环依赖的,通常会走到AbstractBeanFactory类中下面的判断,抛出异常。通过构造器注入的循环依赖,也是无法解决的。 对于 setter 注入造成的依赖可以通过 Spring 容器提前暴...

  • 一月 20, 2020
    并发编程之ThreadLocal解读

    ThreadLocal实例的弱引用对象会作为key存放在ThreadLocalMap中,然后set方法加入的值就作为ThreadLocalMap中的value。它提供了线程本地变量,可以保证访问到的变量属于当前线程。 属性private final int threadLocalHashCode = nextHashCode(); //用于计算threadLocal的hash值,每个对象一...

  • 十二月 2019

  • 十二月 15, 2019
    源码系列-ConcurrentHashMap源码

    结构 JDK1.8 的实现摒弃了Segment的概念,直接用Node数组 + 链表 + 红黑树的数据结构来实现,并发控制使用Synchronized和CAS来操作, sizeCtl用来控制table的初始化和扩容的操作,不同的值有不同的含义。 table未初始化时:sizeCtl = 0或者 sizeCtl= capacity; table正在初始化:sizeCtl = -1; table...

  • 十月 2019

  • 十月 23, 2019
    源码系列-HashMap源码

    类图首先看一下Map家族四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap。 下面我们主要解读HashMap,结合源码,从存储结构、常用方法分析、扩容以及安全性等方面深入解读HashMap的工作原理。 存储结构从结构实现来讲,HashMap是数组+链表+红黑树(JDK1.8增加了红黑树部分)实现的,如下图所示: 引入了红黑树是因为它查找...

  • 九月 2019

  • 九月 05, 2019
    并发编程之LockSupport

    LockSupportLockSupport提供的park/unpark是以线程的角度来设计,真正解耦了线程之间的同步。 核心方法 park()方法,对当前线程执行阻塞操作,直到获取到可用许可后才解除阻塞,也就相当于当前线程进入阻塞状态。 park 方法还可以在其他任何时间“毫无理由”地返回,因此通常必须在重新检查返回条件的循环里调用此方法。park不会释放当前线程占有的锁资源。 pa...

  • 九月 05, 2019
    并发编程之AQS原理剖析

    AQS的类图结构AQS全称是AbstractQueuedSynchronizer,即抽象同步队列。下面看一下AQS的类图结构: state属性在AQS中维持了一个volatile修饰的单一共享状态state,来实现同步器同步。其更新采用乐观锁思想的CAS算法。 CLH队列CLH(Craig, Landin, and Hagersten locks) 同步队列 是一个FIFO双向队列,其内部...

  • 八月 2019

  • 八月 23, 2019
    并发编程之锁

    乐观锁 & 悲观锁乐观锁 乐观锁认为一个线程去拿数据的时候不会有其他线程对数据进行更改,所以不会上锁。 实现方式:CAS机制、版本号机制 悲观锁悲观锁认为一个线程去拿数据时一定会有其他线程对数据进行更改。所以一个线程在拿数据的时候都会顺便加锁,这样别的线程此时想拿这个数据就会阻塞。比如Java里面的synchronized关键字的实现就是悲观锁。 实现方式:就是加锁。 排他锁...

  • 八月 07, 2019
    并发编程之死锁、活锁、饥饿

    死锁死锁是指两个或两个以上的进程(线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程(线程)称为死锁进程(线程)。 死锁产生的四个必要条件 互斥条件:线程(进程)对于所分配到的资源具有排它性,即一个资源只能被一个线程(进程)占用,直到被该线程(进程)释放 请求与保持条件:...

  • 七月 2019

  • 七月 15, 2019
    并发编程之上下文切换

    上下文切换CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换。 上下文切换性能消耗在哪里?上下文切换过高,会导致CPU像个搬运工,频繁在寄存器和运行队列直接奔波 ,更多的时间花在了线程切换,而不是真正工作的线程上。直接的消...

  • 七月 05, 2019
    java基础之HashMap与ConcurrentHashMap重点解读

    HashMap HashMap 说明 底层结构 1. JDK1.8之前:数组+链表2. JDK1.8:数组+链表/红黑树链表与红黑树之间的转换:链表->红黑树:链表长度大于等于8且数组长度(hash桶)大于等于64的时候红黑树->链表:红黑树的节点数量小于等于6的时候退化为链表 元素特性 key、value可以为null,只能有一个key为null的键值对,允许有多...

  • 六月 2019

  • 六月 28, 2019
    Java基础之intern方法

    intern方法有什么用String.intern() 方法可以使得所有含相同内容的字符串都共享同一个内存对象。 JVM 中,存在一个字符串常量池,字符串的值都存放在这个池中。当调用 intern 方法时,如果字符串常量池中已经存在该字符串,那么返回池中的字符串;否则将此字符串添加到字符串常量池中,并返回字符串的引用。 实现JDK1.6 中,常量池在方法区。JDK1.7 中,常量池移到堆区了...

  • 六月 05, 2019
    redis专题-热点key解决方案

    热Key问题热key问题就是,突然有几十万的请求去访问redis上的某个特定key。那么,这样会造成流量过于集中,达到物理网卡上限,从而导致这台redis的服务器宕机。 如何发现热key 凭借业务经验,进行预估哪些是热key 在客户端进行收集 在操作redis之前,加入一行代码进行数据统计。 在Proxy层做收集 用redis自带命令 monitor命令,该命令可以实时抓取出redis服务...

  • 五月 2019

  • 五月 21, 2019
    redis专题-必知必会的基础知识

    Redis有哪些优缺点?优点 读写性能优异, Redis能读的速度是110000次/s,写的速度是81000次/s。 支持数据持久化,支持AOF和RDB两种持久化方式。 支持事务,Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。 数据结构丰富,除了支持string类型的value外还支持hash、set、zset、list等数据结构。 支持主从复制,主机...

  • 五月 10, 2019
    Redis底层数据结构

    Redis底层数据结构简单动态字符串(SDS) 相较于C字符串的优点: 常数复杂度获取字符串长度。 杜绝缓冲区溢出。C字符串不记录自身长度容易造成缓冲区溢出,SDS修改时,API会自动将SDS的空间扩展至执行修改所需的大小,然后才执行实际的修改操作。 减少修改字符串时带来的内存重分配次数。SDS采用空间预分配(增长操作)和惰性释放(缩短操作) 二进制安全。C字符串只能保存文本数据,而不能保...

  • 四月 2019

  • 四月 23, 2019
    HTTP、HTTPS协议详解

    概述早期以信息发布为主的Web 1.0时代,HTTP已可以满足绝大部分需要。证书费用、服务器的计算资源都比较昂贵,作为HTTP安全扩展的HTTPS,通常只应用在登录、交易等少数环境中。但随着越来越多的重要业务往线上转移,网站对用户隐私和安全性也越来越重视。对于防止恶意监听、中间人攻击、恶意劫持篡改,HTTPS是目前较为可行的方案,全站HTTPS逐渐成为主流网站的选择。 HTTP简介HTTP(...

  • 四月 02, 2019
    密码学初探

    基本认知密码学有着严格的规范,其算法的实现原理是公开的。密码学算法是相对安全的,主要解决四个问题: 机密性(隐私性):在网络中传递的数据如果具备机密性,只有拥有密钥的才能解释这些数据,密钥是加密算法的关键。 完整性:接收方能够确保接收到的数据就是发送方发送的原始数据,在密码学中,主要使用消息验证码(MAC)算法保证完整性。 身份验证:通信双方必须确保对端就是要通信的对象。在密码学中,一般使...

  • 三月 2019

  • 三月 21, 2019
    计算机网络、TCP原理

    计算机网络体系结构 应用层:通过应用进程间的交互来完成特定的网络应用。应用层协议定义的是应用进程间通信和交互的规则。应用层交互的数据单元成为报文。常用应用层协议有HTTP、DNS、FTP、SMTP。 运输层:运输层的任务就是负责向两个主机中进程之间的通信提供通用的数据传输服务。运输层主要使用以下两种协议: TCP:提供面向连接的、可靠的数据传输服务,其数据传输单位是报文段。 UDP:提...

0%