自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 java自旋锁的实现及其分析

自旋锁是指一个线程尝试获取某个锁是,如果该锁已经被其他线程占用了,就一直循环检测锁释放被释放,而不是像互斥锁一样让线程进入挂起或者睡眠状态。自旋锁的的缺点就是会一直死循环一直到获取锁为止,这样会一直消耗cpu内存,但是与互斥锁把线程阻塞,然后再次被唤醒相比在性能方面还是有优势的,因为频繁的从用户态切到内核态,需要消耗系统资源,性能也更惨,但是目前的jvm对synchronized实现做了修改采用...

2020-03-22 12:03:35 603

原创 Zookeeper简单实现分布式锁

分布式锁分布式锁,这个主要得益于zookeeper保证了数据的强一致性(cp)。锁服务可以分两类,一个是保持独占,另外一个是控制时序。保持独占:就是所有试图来获取这个锁的客户端,最终只有一个可以成功获得这把锁,通常的做法是把zk上的一个znode看作一把锁,通过create znode的方式来实现。所有客户端都去创建 /distribute_lock 节点,最终成功创建的那个客户端也即拥有了...

2020-02-27 02:17:31 165

原创 【无标题】

2023-12-01 11:04:44 357

原创 Java-动态代理原理

1.什么是代理模式?1.例子1.例子在了解Java动态代理技术之前,先了解一下什么是代理模式,其实代理模式在生活中很常见,比如房东与中介其实就是一个代理的过程,房东有自己的房子,在代理模式中扮演角色是被代理对象,中介扮演角色是代理对象,此时有租客想租房子,由于中介已经代理了房东的房子,所以租客(客户端)可以直接通过中介(代理对象)询问自己需要的房子类型(忽略租客直接找房东),中介由于代理了房东的房子(被代理对象),当然中介可以代理多个房东的房子,以应对不同的租客(客户端).这 个过程其实就是代理模式

2021-10-02 05:22:45 152

原创 纷享销客面试

一面 一个小时多20分钟 2020.10.281.在项目中有用集合?2.用了那些集合?3.arraylist底层原理?4.arrayList和数组的区别?5.ArrayList的遍历元素的几种方式5.hashMap是k-v存储,他有那些居然提的应用场景6.hashMap是key-value是怎么存储的,是分开还是一起7.HashSet是底层是怎么实现的?8.HashSet是如何做到不重复的?在hashMap中存储的是什么9.一些场景如何顺序存入hashSet还是TreeSet,他能

2020-11-05 15:30:14 761

原创 AQS深入学习

AQS是指JUC包下的AbstractQueuedSynchronizer的简称,它是Java锁以及一些同步器(JUC包)实现的核心,大部分JUC下的类内部的提供了一个实现了AQS的子类来提供辅助。AQS还继承了一个AbstractOwnableSynchronizer类,它是AQS的实现的重要基础。AQS实现主要是依赖一个先进先出(FIFO)的等待队列和一个volatile标记的int型state状态标记。AQS的FIFO等待队列,是基于双向链表实现的,是典型的CLH队列改造而来首先来看一下AQS

2020-10-26 11:26:01 211 1

转载 TCP/IP的三次握手、四次挥手

本文通过图来梳理TCP-IP协议相关知识。TCP通信过程包括三个步骤:建立TCP连接通道,传输数据,断开TCP连接通道。如图1所示,给出了TCP通信过程的示意图。上图主要包括三部分:建立连接、传输数据、断开连接。建立TCP连接很简单,通过三次握手便可建立连接。建立好连接后,开始传输数据。TCP数据传输牵涉到的概念很多:超时重传、快速重传、流量控制、拥塞控制等等。断开连接的过程也很简单,通过四次握手完成断开连接的过程。三次握手建立连接:第一次握手:客户端发送syn包(seq=x)到服务器,并进

2020-10-10 17:22:23 443

转载 Java的对象头和对象组成详解

转载于https://blog.csdn.net/lkforce/article/details/81128115?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.chann.

2020-07-30 16:44:48 91

原创 对Lombok的一些个人见解

Lombok项目是一个Java库,它会自动插入编辑器和构建工具中,Lombok提供了一组有用的注释,用来消除Java类中的大量样板代码。仅五个字符(@Data)就可以替换数百行代码从而产生干净,简洁且易于维护的Java类。-百度百科首先做Java开放的相信都已经对这个插件很熟悉了,他不仅会自动帮我们生产实体类的get/set方法,同时他还有更强大的功能,他除了自动生成get/set方法外还支持建造者模式、链式编程,而且只需要添加一个注解@Builder(toBuilder = true)就可以使用建.

2020-06-08 17:49:01 217

原创 初步了解ForkJoin分支合并框架

看一下类图Fork/Join是java在1.7之后加入的一个并行计算框架,他采用了分治的思想,把一个大任务分成若干个小任务,并子任务又有可能进行进行拆分,最后计算完成后进行结果合并,整个过程是递归的过程。Fork是将一个任务进行拆分成子任务,子任务进行计算,Join则是把子任务计算的结果,进合并。实例package jdk8;import java.util.concurrent.E...

2020-03-20 20:35:55 145

原创 线程池的使用和原理分析

首先看一下类图线程池的执行流程线程池整个流程:创建线程池,开始等待请求调用execute()方法添加一个请求任务时,线程池会判断如果正在运行的线程数雄安与核心线程数,那么会创建线程运行这个任务如果正在运行的线程数大于或者等于核心线程数,则将这个任务放入队列中如果这个队列满了,而且线程数论小于最大线程数,则创建非核心线程执行任务如果队列满了,而且正在运行的线程数也大于或者等...

2020-03-20 20:19:51 142

原创 Java中CAS的的简单了解和使用

CAS(Compare And Swap)比较并交换,是一个无锁算法,是一种乐观锁,采用cas可以实现线程安全问题,CAS一般有三个值,内存值,预期原值,新值,只有当内存值与预期原值相同的时候才能进行修改,如果不相同的时候,是无法进行修改操作的。JUC包下的原子类操作全部是使用CAS实现的,包括并发容器,线程池等很多也采用CAS来保证原子性操作。但是CAS也有几个问题:首先ABA问题,循环太久...

2020-03-18 16:55:49 246

原创 FutureTask源码了解

FutureTask分析基于jdk11 但是和1.8有一些小差别先看一下简单使用//静态内部类创建单例线程池 -利用了类机制 static class SinglePool{ public static ThreadPoolExecutor executor = new ThreadPoolExecutor(4, 50, 2000, TimeUnit.SECONDS, ...

2020-03-18 14:56:25 122

原创 线程的4种创建方式

多线程直接开干不废话,在java中,我们都知道创建线程一般都有两种方法,一种是通过Thread类,一种是实习Runnable接口,这两种都是我们常用的,其实还有几种也可以创建线程。下面重点介绍另外两种。通过Thread类创建线程 static class Thread1 extends Thread{ @Override public void ru...

2020-03-18 00:41:36 105

原创 线程的几种状态及其经典的生产者-消费者模型

五种状态:创建初始化状态创建一个线程类,new一个实例出来,线程就进入初始化状态就绪(Runnable):只缺CPU可运行状态只说明有资格运行,CPU调度程序没挑中你,就只能在可运行状态调用线程start()方法,进入线程Runnable当前线程sleep方法结束,或者其他线程join结束,或者某个线程拿到对象锁,这些均可使线程进入可运行状态当前线程时间片用完了,调用当前线...

2020-03-17 13:40:51 128

原创 HashMap 源码初次剖析

基于jdk11首先,我们了解一下HashMap的底层结构历史,在JDK1.8之前采用的是数组+链表的数据结构来存储数据,是不是觉得很熟悉,没错这玩意在1.8之前的结构就和HashTable一样都是采用数组+链表,同样也是通过链地址法(这里简称拉链法)来解决冲突,但是HashMap和HashTable的区别是一个是线程安全的,一个是非线程安全的。然后知道jdk1.8出来以后,HashMap做性能优...

2020-03-15 03:37:52 302

原创 深入HashTable 源码分析

### HashTable分析是基于jdk11,但与jdk1.8相差并不大HashTable是一个安全散列集,它是以Key-Value对的形式存储,和HasMap一样它同样也存在哈希冲突的情况,因此HashTable采用了数组+单链表的方式来减少哈希冲突(简称拉链法),此外,它的所有涉及到并发的方法的被synchroniced关键字修饰(即在方法加了同步锁),所以在并发情况下是线程安全的,但...

2020-03-13 17:00:01 165

原创 CopyOnWriteArrayList 源码剖析

CopyOnWriteArrayList&CopyOnWriteArraySet由于ArrayList操作并发下非线程安全,因为当一个线程在读,另外一个线程在写这样会造成线程不安全,因此引出了CopyOnWriteArrayList 也叫写时复制集合,而为什么要把CopyOnWriteArraySet也在这里说的主要是这个Set内部大部分是基于CopyOnWriteArrayList实现...

2020-03-13 01:26:44 485

原创 深入LinkedList 源码分析-jdk1.8

LinkedList在分析源码之前先分析一下LinkedList的数据结构,首先进入源码看介绍或者看LinkedList的全局变量都可以看到LinkedList是基于双链表实现的,数据存储是存储在节点Node中的下面是数据结构类型的源码:public class LinkedList<E> extends AbstractSequentialList<E> ...

2020-03-12 16:35:32 135

原创 Vectory 源码分析

Vectorvector是java很早就出来的一个继承list的子类,基本属于淘汰级别,它与ArrayList相比实现级别相同,但Vector是线程安全的,基本上所有的方法都添加了Synchronized关键字来实现方法级别的同步锁,虽然控制了线程安全但性能也受到了大大的影响先看一下Vector的全局变量、构造方法以及继承那些和实现那些接口//可以看到Vectors和ArrayList一...

2020-03-12 02:37:59 545

原创 Collections中的 SynchronizedList 源码阅读

SynchronizedListSynchronizedList是一个基于同步锁实现的List,是Collections工具类里面的一个静态类,与ArrayList相比,它是线程安全的,与Vector相比他性能又要好一些,因为Vector实现同步锁是基于方法级别,而SynchronizedList实现同步锁是在代码级别范围更小,性能更高效。(与其他使用轻量级锁的并发容器相比效率还是比较低,虽然j...

2020-03-12 01:57:59 295

原创 ArrayList源码分析 基于jdk1.8

ArrayList由于ArrayList的数据结构是基于数组的形式所以在查找、修改和尾部添加方面很快,但删除和指定位置添加速度比较慢首先看ArraysList的全局变量如下:public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, ...

2020-03-11 22:42:10 212

原创 基于redis实现的简单分布式锁

单实例的分布式锁:加锁-设计思路是通过setnx命令(只有key不存中才可以加锁)给key设置一个value值(用UUID/雪花算法)并设置一个有效时间(避免死锁),注意value值必须是唯一的字符串(后期作为解锁条件之一的判断依据(自动失效也是一种))在加锁的时候还需要设置一个加锁的超时时间,若超过这个时间则放弃获取锁释放锁的时候通过UUID判断该线程的锁是不是该锁,若不是则放弃解锁,否则...

2020-03-03 13:41:21 111

原创 了解mysql数据库的锁机制

锁机制:解决因资源共享,而造成的并发问题。分类操作类型:读锁(共享锁):对同一个数据,多个读操作可以同时进行,互不干扰写锁(互斥锁):如果当前写操作没完毕,则无法进行其他的读操作、写操作操作操作范围:表锁:一次性对一张表整体加锁。如MyISAM存储引擎使用表锁,开销小,加锁块,无死锁,但锁范围大,容易发生锁冲突,并发效率低行锁:一次性对一条数据加锁。如InnoDB存储引...

2019-10-28 18:50:29 302

原创 Springboot整合redsi+JWT开发登陆权限

//springboot整合redis+jwt做双token刷新登陆有效时间前置知识:redis基础和了解Spring的RedisTemplate的基本用法(这里不多说redis本人也是刚刚接触不久)、MD5密码加油加盟(在我前面的博客中有写)、JWT的做登陆权限入门中有解析思路:用户密码登陆---->JwtInterceptor拦截器(放行登陆请求)--->Controller...

2019-07-27 14:22:05 395 4

空空如也

空空如也

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

TA关注的人

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