自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(134)
  • 资源 (1)
  • 收藏
  • 关注

原创 golang学习笔记(内存模型和分配机制)

(0, 16B) 且不包含指针的对象: Tiny分配(0, 16B) 包含指针的对象: 正常分配[16B, 32KB] : 正常分配(32KB, -) : 大对象分配其中Tiny分配和大对象分配都属于内存管理的优化范畴, 这里暂时仅关注一般的分配方法。获取当前线程的私有缓存mcache跟据size计算出适合的class的ID从mcache的alloc[class]链表中查询可用的span如果mcache没有可用的span则从mcentral申请一个新的span加入mcache中。

2024-05-04 02:26:54 1293

原创 golang学习笔记(内存逃逸分析)

栈上分配内存比在堆中分配内存有更高的效率栈上分配的内存不需要GC处理堆上分配的内存使用完毕会交给GC处理逃逸分析目的是决定内分配地址是栈还是堆逃逸分析在编译阶段完成。

2024-05-03 02:55:08 161

原创 golang学习笔记(协程的基础知识)

协程是一种轻量级的线程,它可以实现并发执行的并行操作。协程是Go语言中的一个核心特性,它使得程序能够以并发的方式运行,并且非常高效。与传统的线程相比,协程的创建和销毁成本非常低,可以方便地启动大量的协程来执行并行操作。Golang的协程不同于其他语言中的线程或进程,它们是由Go语言的运行时系统调度的。协程的调度是基于协作式的,即协程自己主动让出CPU的控制权,而不是依赖于操作系统的调度器。

2024-05-03 01:23:00 1169

原创 golang学习笔记(defer基础知识)

定义defer类似于入栈操作, 执行defer类似于出栈操作。设计defer的初衷是简化函数返回时资源清理的动作, 资源往往有依赖顺序, 比如先申请A资源, 再跟据A资源申请B资源, 跟据B资源申请C资源, 即申请顺序是:A—>B—>C, 释放时往往又要反向进行。这就是把deffer设计成FIFO的原因。每申请到一个用完需要释放的资源时, 立即定义一个defer来释放资源是个很好的习惯。defer定义的延迟函数参数在defer语句出时就已经确定下来了defer定义顺序与实际执行顺序相反。

2024-04-24 22:45:27 769

原创 Netty学习笔记一(NIO基础知识)

java.nio全称java non-blocking IO,是指jdk1.4 及以上版本里提供的新api(New IO) ,为所有的原始类型(boolean类型除外)提供缓存支持的数据容器,使用它可以提供非阻塞式的高伸缩性网络。

2024-04-22 22:52:20 811

原创 golang学习笔记(net/http库基本使用)

我们先看看标准库net/http如何处理一个请求。代码块定义了两个不同的路由,分别是“/”和“/count”,分别绑定 handler 和 counter, 根据不同的HTTP请求会调用不同的处理函数。

2024-04-22 00:25:15 385

原创 golang简单的函数生成验证码图片

【代码】golang简单的函数生成验证码图片。

2023-12-10 20:22:36 536 1

原创 基于go语言的随机数生成工具

【代码】基于go语言的随机数生成工具。

2023-10-03 01:42:03 210

原创 go语言学习笔记1

​ GoLang是一种静态强类型、编译型、并发型,并具有功能的编程语言;它可以在不损失应用程序性能的情况下极大的降低代码的复杂性,还可以发挥多核处理器同步多工的优点,并可解决面向对象程序设计的麻烦,并帮助程序设计师处理琐碎但重要的内存管理问题。相比于其他编程语言,简洁、快速、安全、并行、有趣、开源、内存管理、数组安全、编译迅速是其特色。

2023-07-01 17:00:16 360

原创 JUC并发编程系列详解篇之十八(CPU缓存架构与缓存一致性协议详解)

CPU缓存即高速缓冲存储器,是位于CPU与主内存间的一种容量较小但速度很高的存储器。由于CPU的速度远高于主内存,CPU直接从内存中存取数据要等待一定时间周期,Cache中保存着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据时可从Cache中直接调用,减少CPU的等待时间,提高了系统的效率。

2022-10-04 16:13:05 270 1

原创 TCP/IP协议详解篇三(链路层)

1、链路是从一个结点到相邻结点的一段物理线路,数据链路则是在链路的基础上增加了一-些必要的硬件(如网络适配器)和软件(如协议的实现)。2、数据链路层使用的信道主要有点对点信道和广播信道两种。3、数据链路层传送的协议数据单元是帧。封装成帧、透明传输和差错检测。4、循环冗余检验CRC是一种检错方法,而帧检验序列FCS是添加在数据后面的冗余码。5、点对点协议PPP简单;只检测差错,而不是纠正差错;不使用序号,也不进行流量控制;可同时支持多种网络层协议。6、PPPoE是为宽带上网的主机使用的链路层协议。

2022-09-17 01:07:33 2788

原创 TCP/IP协议详解篇二(物理层)

1、物理层的主要任务就是确定与传输媒体的接口有关的一些特性,如机械特性、电气特性、功能特性和过程特性。2、一个数据通信系统可划分为三大部分,即源系统、传输系统和目的系统。源系统包括源点(或源站、信源)和发送器,目的系统包括接收器和终点(或目的站,或信宿)。3、通信的目的是传送消息。如话音、文字、图像、视频等都是消息。数据是运送消息的实体。信号则是数据的电气或电磁的表现。4、根据信号中代表消息的参数的取值方式不同,信号可分为模拟信号(或连续信号)和数字信号(或离散信号)。

2022-09-17 01:04:52 664

原创 TCP/IP协议详解篇一(基础)

OSI的七层协议体系结构主要有应用层,表示层,会话层,传输层,网络层,数据链路层,物理层,这个体系结构的概念清楚,理论也较完整,但它既复杂又不实用。TCP/IP体系结构则不同,但它现在却得到了非常广泛的应用。

2022-09-17 00:47:16 1268

原创 JUC并发编程系列详解篇十七(happens-before原则)

happens-before是JMM最核心的概念。对应Java程序员来说,理解happens-before是理解JMM的关键。

2022-09-12 23:55:44 337 1

原创 JUC并发编程系列详解篇十六(java中的其他锁)

无锁,偏向锁,轻量级锁,重量级锁,这四种锁是指锁的状态,专门针对synchronized的。偏向锁通过对比Mark Word解决加锁问题,避免执行CAS操作。而轻量级锁是通过用CAS操作和自旋来解决加锁问题,避免线程阻塞和唤醒而影响性能。重量级锁是将除了拥有锁的线程以外的线程都阻塞。

2022-09-12 16:17:34 255

原创 JUC并发编程系列详解篇十五(公平锁VS非公平锁)

ReentrantLock 是一把可重入锁,也是一把互斥锁,它具有与 synchronized 相同的方法和监视器锁的语义,但是它比 synchronized 有更多可扩展的功能。ReentrantLock 的可重入性是指它可以由上次成功锁定但还未解锁的线程拥有。当只有一个线程尝试加锁时,该线程调用 lock() 方法会立刻返回成功并直接获取锁。如果当前线程已经拥有这把锁,这个方法会立刻返回。可以使用 isHeldByCurrentThread 和 getHoldCount 进行检查。

2022-09-12 15:56:45 309

原创 JUC并发编程系列详解篇十四(自旋锁 VS 适应性自旋锁)

自旋锁 VS 适应性自旋锁 ,当一个线程尝试去获取某一把锁的时候,如果这个锁此时已经被别人获取(占用),那么此线程就无法获取到这把锁,该线程将会等待,间隔一段时间后会再次尝试获取。这种采用循环加锁 -> 等待的机制被称为自旋锁(spinlock)。

2022-09-12 01:41:08 260

原创 JUC并发编程系列详解篇十三(悲观锁VS乐观锁)

在java并发编程中,锁有很多种类,如下图所示:悲观锁乐观锁自旋锁适应性自旋锁无锁偏向锁轻量级锁重量级锁公平锁非公平锁可重入锁不可重入锁共享锁排他锁。

2022-09-11 23:57:48 278

原创 JUC并发编程系列详解篇十二(synchronized底层原理进阶)

之后的程序睡眠5秒钟后,程序中t1、t2线程执行代码块时,有意的将其线程睡眠几秒钟,目的在于不管那个线程率先抢到锁,都能让另外一个线程在自旋等待中,所以t1线程打印的是“00”就已经是轻量级锁了,最后看程序执行结果,t2打印的是“10”就已经升级为重量级锁了,显然t2线程已经超过了自旋的最大次数,已经转成重量级锁了。接着线程t1打印了object对象头,可以与第一个打印出来的对象头对比不难发现t1打印的也是偏向锁,但是t1打印的对象头已经把t1的线程id记录在了其对应的23位;

2022-09-11 20:04:11 561

原创 JUC并发编程系列详解篇十一(synchronized底层的锁)

操作系统分为“用户空间”和“内核空间”,JVM是运行在“用户态”的,jdk1.6之前,在使用synchronized锁时需要调用底层的操作系统实现,其底层monitor会阻塞和唤醒线程,线程的阻塞和唤醒需要CPU从“用户态”转为“内核态”,频繁的阻塞和唤醒对CPU来说是一件负担很重的工作,这些操作给系统的并发性能 带来了很大的压力。同这个时候CPU就需要从“用户态”切向“内核态”,在这个过程中就非常损耗性能而且效率非常低,所以说jdk1.6之前的synchronized是重量级锁。

2022-09-11 01:25:59 428

原创 JUC并发编程系列详解篇十(Synchronized底层原理分析)

synchronized 锁机制在 Java 虚拟机中的同步是基于进入和退出监视器锁对象 monitor 实现的(无论是显示同步还是隐式同步都是如此),每个对象的对象头都关联着一个 monitor 对象,当一个 monitor 被某个线程持有后,它便处于锁定状态。

2022-09-11 00:30:16 290

原创 JUC并发编程系列详解篇九(synchronized基础)

在JVM中,对象在内存中的布局分为三块区域:对象头、实例数据和对齐填充。对象头又包括两部分信息,第一部分用于存储对象自身的运行时数据(Mark Word),如HashCode、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。对象头的另外一部分是类型指针(Klass pointer),即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。

2022-09-10 23:16:14 492

原创 JUC并发编程系列详解篇六(死锁的基本概念)

银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,这就需要引入安全序列来进行判断资源分配是否合理。安全序列是指一个进程序列比如从P1到Pn是安全的,即对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j < i )当前占有资源量之和。

2022-09-10 14:56:00 196

原创 JUC并发编程系列详解篇五(线程基础理论进阶)

什么是线程安全?当多线程运行了同一代码的时候,如果产生了不同的结果会怎么样?就好比如家里养的鸡下的蛋结果却孵出来一个老鹰,这怎么也显得不合适了,所以线程安全说白了就一句话,当多线程运行同一代码,不会产生不一样的结果。即代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。在多线程环境中,当各线程不共享数据的时候,即都是私有(private)成员,那么一定是线程安全的。

2022-09-10 14:52:36 145

原创 JUC并发编程系列详解篇四(线程基础理论)

这其实是很有意义的,首先多线程的运行和单线程运行相比有很多复杂困难的问题,因为多线程运行充满了未知性,比如说某条线程是否运行,运行了多少时间,线程所期望的数据是否已经赋值完毕,Callable接口的泛型的Future/FutureTask却可以获取多线程运行的结果,可以在等待时间太长没获取到需要的数据的情况下取消该线程的任务。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。创建一个单线程的线程池。

2022-09-10 14:36:06 173

原创 JUC并发编程系列详解篇三(三大根源性问题)

对于如今的多核处理器,每颗CPU都有自己的缓存,缓存读取的速度非常快,但是缓存仅仅对它所在的处理器可见,CPU缓存与内存的数据不容易保证一致。因此为了避免处理器停顿下来等待向内存写入数据而产生的延迟,处理器使用写缓冲区来临时保存向内存写入的数据。写缓冲区合并对同一内存地址的多次写,并以批处理的方式刷新,也就是说写缓冲区不会即时将数据刷新到主内存中。这个时候缓存不能及时刷新向内存中写入数据,这就导致了可见性问题。

2022-09-10 14:05:13 97

原创 JUC并发编程系列详解篇二(并发编程挑战篇)

资源限制是指在进行并发编程时,程序的执行速度受限于计算机硬件资源或软件资源。举例说明:例如,服务器的带宽只有2Mb/s,某个资源的下载速度是1Mb/s每秒,系统启动10个线程下载资源,下载速度不会变成10Mb/s,所以在进行并发编程时,要考虑这些资源的限制。硬件资源限制有带宽的上传/下载速度、硬盘读写速度和CPU的处理速度。软件资源限制有数据库的连接数和socket连接数等。

2022-09-10 13:48:07 125

原创 JUC并发编程系列详解篇一(基础)

同步和异步通常来形容一次方法调用,同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。异步方法调用更像一个消息传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。而异步方法通常会在另外一个线程中“真实”地执行。整个过程,不会阻碍调用者的工作。如图所示:图中显示了同步方法调用和异步方法调用的区别。对于调用者来说,异步调用似乎是一瞬间就完成的。如果异步调用需要返回结果,那么当这个异步调用真实完成时,则会通知调用者。

2022-09-10 01:36:39 643

原创 java虚拟机详解篇十四(java堆内存)

Java堆(Java Heap)是虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,Java堆是垃圾收集器管理的内存区域。一个JVM实例只存在一个堆内存,所有的对象实例和数组都应该在运行时分配到堆上。堆也是Java内存管理的核心区域。Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。堆内存的大小是可以调节的。

2022-08-24 12:58:00 1015

原创 java虚拟机详解篇十三(本地方法栈)

java的虚拟机栈用于管理java方法的调用,而本地方法栈用于管理本地方法的调用。(本地方法栈线程私有)本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别是本地方法栈的使用语言,方式和数据结构并没有强制的规定,可以根据需要自由实现。有的java虚拟机直接把本地方法栈和虚拟机栈合二为一(Hotspot JVM),与虚拟机栈一样,本地方法栈也会在栈深度溢出或者栈扩展失败时分别抛出和异常。

2022-08-24 12:50:53 972

原创 java虚拟机详解篇十二(方法调用和方法的绑定机制)

在jvm中将符号引用为调用方法的直接引用与方法的绑定机制有关,如果方法在在编译期就确定了调用的具体版本,这个版本在运行的时候是不可变的,这样的方法被称之为非虚方法。静态方法,私有方法,final方法,实例构造器,父类方法都是非虚方法。其它的方法被称之为虚方法。1、invokestatic:调用静态方法,解析阶段确定唯一方法版本2、 invokespecial:调用方法、私有及父类方法,解析阶段确定唯一方法版本3、invokevirtual:调用所有虚方法。

2022-08-24 00:31:59 165

原创 java虚拟机详解篇十一(java虚拟机栈)

当一个方法开始执行后,只有两种方式退出这个方法。第一种方式是执行引擎遇到任意一个方法返回的字节码指令(return指令),这时候可能会有返回值传递给上层的方法调用者(调用当前方法的方法称为调用者或者主调方法),方法是否有返回值以及返回值的类型将根据遇到何种方法返回指令来决定,这种退出方法的方式称为“正常调用完成”(Normal Method Invocation Completion)。另外一种退出方式是在方法执行的过程中遇到了异常,并且这个异常没有在方法体内得到妥善处理。

2022-08-24 00:28:53 794 1

原创 java虚拟机详解十(程序计数器)

CPU在运行的过程中不断做任务切换,多线程是在一个时间段内只会执行其中的某一个线程的方法,这样必然会有中断和异常,为了准确记录各个线程正在执行的当前字节码指令地址,那就必须每一个线程配备一个PC寄存器,这样线程可以独立计算,不会互相干扰。由于CPU时间片限制,众多线程在并发执行过程中,任何一个确定的时刻,一个处理器或者多核处理器中的一个内核,只会执行某一个线程的字节码指令。:当程序运行时,CPU需要不断切换其他的线程,当CPU切换回原来的线程时,CPU就知道从哪里开始执行。

2022-08-24 00:20:22 274

原创 java泛型机制详解篇二(深入理解泛型篇一)

当类定义中的类型参数没有任何限制时,在类型擦除中直接被替换为Object,即形如和的类型参数都被替换为Object。

2022-08-23 17:25:36 125

原创 java虚拟机详解篇九(代码编译追踪)

执行偏移地址为14的指令,iload_3指令把存放在第三个局部变量槽中的300入栈到操作数栈,这时操作数栈的值为两个整形数字300,下一条指令imul将操作数栈顶的两个元素出栈,做整形乘法,然后把结果入栈,与iadd指令的执行过程类似。执行偏移地址为2的指令,istore_1指令的作用是操作数栈顶的整形值出栈并存放到第一个局部变量槽中,后续4条指令(一直到偏移地址为11的指令为止)都是做的一样的事情,也就是在对应的代码中把变量a,b,c赋值100,200,300。

2022-08-23 15:33:43 194

原创 java虚拟机详解篇八(运行时数据区概述)

Java虚拟机的运行时数据区域。

2022-08-23 15:17:02 280

原创 java虚拟机详解篇七(虚拟机线程)

java虚拟机定义了若干程序运行时用到的数据区,其中有一些会随虚拟机的启动而创建,随虚拟机退出而销毁,另外一些则是与线程一一对应,这些与线程对应的数据区域则是随线程的开始和结束而创建和销毁。1、线程是一个程序里的运行单元。JVM允许一个应用有多个线程并行的执行。在Hotspot JVM里,每一个线程都与操作系统的本地线程直接映射。2、当一个java线程准备好执行后,此时一个操作系统的本地线程也同时创建,java线程执行终止后,本地线程也会回收。

2022-08-23 14:51:08 500

原创 java反射机制详解篇一(基础)

当程序执行到new ObjectClass的时候,java虚拟机会加载ObjectClass.class文件,这个文件是由ObjectClass.java生成的,当java虚拟机将ObjectClass.class加载进内存后,内存中会存在一个class对象,这就是一个类加载变成对象的大致过程,具体详细过程可以参考一下。知道了这些,那什么才是反射呢?

2022-08-22 18:40:54 71

原创 java虚拟机详解篇六(类的加载机制)

类的加载机制一共有四种,分别是全盘负责机制,父类委托机制,缓存机制,还有最重要的双亲委派机制。

2022-08-17 23:55:44 189

原创 java虚拟机详解篇五(类的加载器)

在java程序开发的过程中,类的加载基本上都是由上述三类加载器加载完成,在必要的时候可以自己定义类加载器。1、执行代码前自动验证数字签名2、根据用户提供的密码解密代码,从而实现代码混淆器来避免反编译*.class文件3、根据用户需求来动态地加载类4、根据应用需求把其他数据以字节码的形式加载到应用中。1、隔离加载类2、修改类加载的方式3、扩展加载源4、防止源码泄露。...

2022-08-17 17:26:24 383

基于JavaWeb的宠物在线销售网站

Java课程设计,可以使用软件工程课程设计,数据库课程设计。

2023-06-18

基于java写的验证码生成项目,支持gif,png,两种格式,低代码开发。支持更换验证码内容,设置干扰线,设置干扰圆,扭曲效果。

1、支持javaweb项目 2、支持前后端分离项目

2022-03-22

空空如也

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

TA关注的人

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