自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

veno

总要留一点东西吧

  • 博客(113)
  • 收藏
  • 关注

原创 中华人民共和国反不正当竞争法

中华人民共和国反不正当竞争法

2024-03-05 19:54:55 717

原创 中华人民共和国消费者权益保护法

中华人民共和国消费者权益保护法

2024-03-05 19:50:01 998

原创 中华人民共和国民法典

中华人民共和国民法典

2024-03-05 19:35:32 976

原创 JUC集合: CopyOnWriteArrayList详解

CopyOnWriteArrayList是ArrayList 的一个线程安全的变体,其中所有可变操作(add、set 等等)都是通过对底层数组进行一次新的拷贝来实现的。COW模式的体现。

2024-01-11 14:21:39 1009

原创 JUC集合: ConcurrentLinkedQueue详解

ConcurerntLinkedQueue一个基于链接节点的无界线程安全队列。此队列按照 FIFO(先进先出)原则对元素进行排序。队列的头部是队列中时间最长的元素。队列的尾部 是队列中时间最短的元素。新的元素插入到队列的尾部,队列获取操作从队列头部获得元素。当多个线程共享访问一个公共 collection 时,ConcurrentLinkedQueue是一个恰当的选择。此队列不允许使用null元素。

2024-01-11 14:21:14 849

原创 JUC集合: BlockingQueue详解

JUC里的 BlockingQueue 接口表示一个线程安放入和提取实例的队列。本文将给你演示如何使用这个 BlockingQueue,不会讨论如何在 Java 中实现一个你自己的 BlockingQueue。

2024-01-11 14:20:50 909

原创 JUC集合: ConcurrentHashMap详解

HashTable : 使用了synchronized关键字对put等操作进行加锁;ConcurrentHashMap JDK1.7: 使用分段锁机制实现;ConcurrentHashMap JDK1.8: 则使用数组+链表+红黑树数据结构和CAS原子操作实现;

2024-01-11 14:20:07 895

原创 JUC锁: ReentrantReadWriteLock详解

锁降级指的是写锁降级成为读锁。如果当前线程拥有写锁,然后将其释放,最后再获取读锁,这种分段完成的过程不能称之为锁降级。锁降级是指把持住(当前拥有的)写锁,再获取到读锁,随后释放(先前拥有的)写锁的过程。接下来看一个锁降级的示例。if (!update) {// 必须先释放读锁// 锁降级从写锁获取到开始try {if (!update) {// 准备数据的流程(略)// 锁降级完成,写锁降级为读锁try {// 使用数据的流程(略)

2024-01-11 14:19:44 1074

原创 JUC锁: ReentrantLock详解

可重入锁ReentrantLock的底层是通过AbstractQueuedSynchronizer实现,所以先要学习上一章节AbstractQueuedSynchronizer详解。

2024-01-11 14:19:23 863

原创 JUC锁: 锁核心类AQS详解

AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的ReentrantLock,Semaphore,其他的诸如ReentrantReadWriteLock,SynchronousQueue,FutureTask等等皆是基于AQS的。当然,我们自己也能利用AQS非常轻松容易地构造出符合我们自己需求的同步器。

2024-01-11 09:30:18 808

原创 JUC锁: LockSupport详解

LockSupport用来创建锁和其他同步类的基本线程阻塞原语。简而言之,当调用LockSupport.park时,表示当前线程将会等待,直至获得许可,当调用LockSupport.unpark时,必须把等待获得许可的线程作为参数进行传递,好让此线程继续运行。

2024-01-11 09:29:48 879

原创 JUC原子类: CAS, Unsafe和原子类详解

CAS的全称为Compare-And-Swap,直译就是对比交换。是一条CPU的原子指令,其作用是让CPU先进行比较两个值是否相等,然后原子地更新某个位置的值,经过调查发现,其实现方式是基于硬件平台的汇编指令,就是说CAS是靠硬件实现的,JVM只是封装了汇编调用,那些AtomicInteger类便是使用了这些封装后的接口。简单解释:CAS操作需要输入两个数值,一个旧值(期望操作前的值)和一个新值,在操作期间先比较下在旧值有没有发生变化,如果没有发生变化,才交换成新值,发生了变化则不交换。

2024-01-11 09:28:55 829

原创 gitlab注册无中国区电话(+86) 验证问题

公司项目开发,要和老外一起,用公司的邮箱注册,需要手机号验证,但是没找到中国区电话(+86)5 可以看到data 是个数组,随便找一条,这里找到第一条。3 点Initiator 进入代码,在方法处打断点。7 放开断点,回到页面,注册就可以了。2 找到 countries的请求。6 修改区号为86就可以。4 刷新页面debug。

2024-01-10 10:07:50 6178 29

原创 关键字: final详解

基本数据类型:final域写:禁止final域写与构造方法重排序,即禁止final域写重排序到构造方法之外,从而保证该对象对所有线程可见时,该对象的final域全部已经初始化过。final域读:禁止初次读对象的引用与读该对象包含的final域的重排序。引用数据类型:额外增加约束:禁止在构造函数对一个final修饰的对象的成员域的写入与随后将这个被构造的对象的引用赋值给引用变量 重排序。

2024-01-10 09:51:52 872

原创 关键字: volatile详解

相比Sychronized(重量级锁,对系统性能影响较大),volatile提供了另一种解决可见性和有序性问题的方案。

2024-01-10 09:51:29 976

原创 关键字: synchronized详解

示例1@Override// 同步代码块形式——锁为this,两个线程使用的锁是一样的,线程1必须要等到线程0释放了该锁后,才能执行System.out.println("我是线程" + Thread.currentThread().getName());try {System.out.println(Thread.currentThread().getName() + "结束");t1.start();t2.start();我是线程Thread-0Thread-0结束。

2024-01-10 09:51:01 1093

原创 Java并发 - Java中所有的锁

Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自JDK 8和Netty 3.10.6)、使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景。Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家更快捷的理解相关知识。本文Java中常用的锁以及常见的锁的概念进行了基本介绍,并从源码以及实际应用的角度进行了对比分析。

2024-01-09 09:00:12 937

原创 Java 并发 - 线程基础

本文主要概要性的介绍线程的基础,为后面的章节深入介绍Java并发的知识提供基础。

2024-01-09 08:59:44 1190

原创 Java 并发 - 理论基础

本文从理论的角度引入并发安全问题以及JMM应对并发问题的原理。

2024-01-09 08:59:21 1053

原创 Map - WeakHashMap源码解析

在Java集合框架系列文章的最后,笔者打算介绍一个特殊的成员: WeakHashMap,从名字可以看出它是某种 Map。它的特殊之处在于 WeakHashMap 里的entry可能会被GC自动删除,即使程序员没有调用remove()或者clear()方法。调用两次size()方法返回不同的值;两次调用isEmpty()方法,第一次返回false,第二次返回true;两次调用containsKey()方法,第一次返回true,第二次返回false,尽管两次使用的是同一个key;

2024-01-09 08:58:29 896

原创 Map - TreeSet & TreeMap 源码解析

之所以把TreeSet和TreeMap放在一起讲解,是因为二者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也就是说TreeSet里面有一个TreeMap(适配器模式)**。因此本文将重点分析TreeMap。Java TreeMap实现了SortedMap接口,也就是说会按照key的大小顺序对Map中的元素进行排序,key大小的评判可以通过其本身的自然顺序(natural ordering),也可以通过构造时传入的比较器(Comparator)。

2024-01-08 09:30:56 988

原创 Map - LinkedHashSet&Map源码解析

如果你已看过前面关于HashSet和HashMap,以及TreeSet和TreeMap的讲解,一定能够想到本文将要讲解的LinkedHashSet和LinkedHashMap其实也是一回事。LinkedHashSet和LinkedHashMap在Java里也有着相同的实现,前者仅仅是对后者做了一层包装,也就是说LinkedHashSet里面有一个LinkedHashMap(适配器模式)。因此本文将重点分析LinkedHashMap。

2024-01-08 09:29:30 841

原创 Map - HashSet & HashMap 源码解析

之所以把HashSet和HashMap放在一起讲解,是因为二者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也就是说HashSet里面有一个HashMap(适配器模式)。因此本文将重点分析HashMap。HashMap实现了Map接口,即允许放入key为null的元素,也允许插入value为null的元素;除该类未实现同步外,其余跟Hashtable大致相同;

2024-01-08 09:27:22 981

原创 Collection - Stack & Queue 源码解析

Java里有一个叫做Stack的类,却没有叫做Queue的类(它是个接口名字)。当需要使用栈时,Java已不推荐使用Stack,而是推荐使用更高效的ArrayDeque;既然Queue只是一个接口,当需要使用队列时也就首选ArrayDeque了(次选是LinkedList)。

2024-01-08 09:25:31 911

原创 Collection - LinkedList源码解析

LinkedList同时实现了List接口和Deque接口,也就是说它既可以看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(Stack)。这样看来,LinkedList简直就是个全能冠军。当你需要使用栈或者队列时,可以考虑使用LinkedList,一方面是因为Java官方已经声明不建议使用Stack类,更遗憾的是,Java里根本没有一个叫做Queue的类(它是个接口名字)。

2024-01-05 09:10:55 892

原创 Collection - ArrayList 源码解析

ArrayList实现了List接口,是顺序容器,即元素存放的数据与放进去的顺序相同,允许放入null元素,底层通过数组实现。除该类未实现同步外,其余跟Vector大致相同。每个ArrayList都有一个容量(capacity),表示底层数组的实际大小,容器内存储元素的个数不能多于当前容量。当向容器中添加元素时,如果容量不足,容器会自动增大底层数组的大小。前面已经提过,Java泛型只是编译器提供的语法糖,所以这里的数组是一个Object数组,以便能够容纳任何类型的对象。

2024-01-05 09:10:26 798

原创 Collection 类关系图

容器,就是可以容纳其他Java对象的对象。降低编程难度提高程序性能提高API间的互操作性降低学习难度降低设计和实现相关API的难度增加程序的重用性Java容器里只能放对象,对于基本类型(int, long, float, double等),需要将其包装成对象类型后(Integer, Long, Float, Double等)才能放到容器里。很多时候拆包装和解包装能够自动完成。这虽然会导致额外的性能和空间开销,但简化了设计和编程。

2024-01-05 09:09:51 868

原创 Java常用机制 - SPI机制详解

SPI(Service Provider Interface),是JDK内置的一种 服务提供发现机制,可以用来启用框架扩展和替换组件,主要是被框架的开发人员使用,比如java.sql.Driver接口,其他不同厂商可以针对同一接口做出不同的实现,MySQL和PostgreSQL都有不同的实现提供给用户,而Java的SPI机制可以为某个接口寻找服务实现。Java中SPI机制主要思想是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要,其核心思想就是 解耦。

2024-01-04 10:20:55 2333

原创 Java 基础 - 反射机制详解

RTTI(Run-Time Type Identification)运行时类型识别。在《Thinking in Java》一书第十四章中有提到,其作用是在运行时识别一个对象的类型和类的信息。主要有两种方式:一种是“传统的”RTTI,它假定我们在编译时已经知道了所有的类型;另一种是“反射”机制,它允许我们在运行时发现和使用类的信息。反射就是把java类中的各种成分映射成一个个的Java对象例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。C

2024-01-04 10:20:02 971

原创 Java 基础 - 异常机制详解

super(msg);// ...try、catch和finally都不能单独使用,只能是try-catch、try-finally或者try-catch-finally。try语句块监控代码,出现异常就停止执行下面的代码,然后将异常移交给catch语句块来处理。finally语句块中的代码一定会被执行,常用于回收资源。throws:声明一个异常,告知方法调用者。throw :抛出一个异常,至于该异常被捕获还是继续抛出都与它无关。Java编程思想一书中,对异常的总结。

2024-01-04 10:19:33 860

原创 Java 基础 - 注解机制详解

当我们理解了内置注解, 元注解和获取注解的反射接口后,我们便可以开始自定义注解了。定义自己的注解Retention;Target;使用注解} }} }} }Annotation;

2024-01-03 10:00:13 1149

原创 Java 基础 - 泛型机制详解

Java泛型这个特性是从JDK 1.5才开始加入的,因此为了兼容之前的版本,Java泛型的实现采取了“伪泛型”的策略,即Java在语法上支持泛型,但是在编译阶段会进行所谓的“类型擦除”(Type Erasure),将所有的泛型表示(尖括号中的内容)都替换为具体的类型(其对应的原生态类型),就像完全没有泛型一样。本文综合多篇文章后,总结了Java 泛型的相关知识,希望可以提升你对Java中泛型的认知效率。

2024-01-03 09:24:08 1199

原创 Java 基础 - 图谱 & Q/A

不可变对象指对象一旦被创建,状态就不能再改变。任何修改都会创建一个新的对象,如 String、Integer及其它包装类。如何在Java中写出Immutable的类?要写出这样的类,需要遵循以下几个原则:1)immutable对象的状态在创建之后就不能发生改变,任何对它的改变都应该产生一个新的对象。2)Immutable类的所有的属性都应该是final的。3)对象必须被正确的创建,比如: 对象引用在对象创建过程中不能泄露(leak)。

2024-01-02 10:36:32 924

原创 Java 基础 - 知识点

我们希望将这两个对象当成一样的,只在集合中添加一个对象,但是因为 EqualExample 没有实现 hasCode() 方法,因此这两个对象的散列值是不同的,最终导致集合添加了两个等价的对象。因此在方法中改变指针引用的对象,那么这两个指针此时指向的是完全不同的对象,一方改变其所指向对象的内容对另一方没有影响。private 方法隐式地被指定为 final,如果在子类中定义的方法和基类中的一个 private 方法签名相同,此时子类的方法不是重写基类方法,而是在子类中定义了一个新的方法。

2024-01-02 10:12:12 847

原创 架构 - 架构基础: 特点,本质...

所谓架构,见仁见智,很难有一个明确或标准的定义;但架构并非镜花水月或阳春白雪,有系统的地方就需要架构,大到航空飞机,小到一个电商系统里面的一个功能组件,都需要设计和架构。抽象而言,架构就是对系统中的实体以及实体之间的关系所进行的抽象描述,是对物/信息的功能与形式元素之间的对应情况所做的分配,是对元素之间的关系以及元素同周边环境之间的关系所做的定义。架构能将目标系统按某个原则进行切分,切分的原则,是要便于不同的角色进行并行工作,结构良好的创造活动要优于毫无结构的创造活动。

2023-12-28 09:38:52 1061

原创 Java 基础 - 面向对象

本文主要介绍Java OOP 面向对象基础和相关类图。

2023-12-27 16:04:55 802

原创 @ConditionalOnProperty Spring 使用介绍 源码分析

比如用在自定义主从数据库切换,从库是否可用。

2023-12-27 09:54:50 369

原创 看懂UML类图和时序图

这里不会将UML的各种元素都提到,我只想讲讲类图中各个类之间的关系;能看懂类图中各个类之间的线条、箭头代表什么意思后,也就足够应对 日常的工作和交流;同时,我们应该能将类图所表达的含义和最终的代码对应起来;有了这些知识,看后面章节的设计模式结构图就没有什么问题了;本章所有图形使用Enterprise Architect 9.2来画,所有示例详见根目录下的design_patterns.EAP。

2023-12-26 13:53:13 998

原创 架构 - 理解构架的视角

在学习架构时,我认为首先要理清楚架构的视角,。对于不同职位的视角是不一样的,比如开发而言他更多的看到的是开发架构;对售前人员,他可能更多的看到的是业务架构;对于运维人员,他看到的可能是运维架构;而对于技术支持和部署人员,他更多的看到的网络和物理架构。

2023-12-26 09:21:38 883

原创 架构 - 理解构架的分层

技术框架(technological Framework)是整个或部分技术系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法。于开发者而言,实际工作从通常采用的是分层模型,这里独立一个章节,总结经典的七层逻辑架构。

2023-12-26 09:21:16 342

空空如也

空空如也

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

TA关注的人

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