自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java中 == 与 equals

当比较的是两个基本数据类型的变量时:基本数据类型没有equals()方法,所以通过 == 来比较。因为基本数据类型的是放在常量池中,所以 == 看做是比较内容或者是地址 其实都是一样。当比较的是基本数据类型的包装类,包括String:该类将Object的equals()方法重写了,比较的是内容。== 比较的是地址。当比较的是引用类型的对象时:equals()方法和 == 比较的都是地址。当基本数据类型和其相应的包装类比较时:== 和 equals()比较的都是内容。...

2020-10-03 21:48:15 115

原创 java中继承,接口以及访问修饰

继承,接口以及访问权限继承继承的概念为什么要继承继承格式继承类型继承继承的概念继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。为什么要继承当多种类型具有相同的属性或行为时,比如吃喝拉撒。如果不适用继承,那么每种类型都要的创建这些相同的属性和方法,造成代码冗余。使用继承可以将各个类型相同的属性和方法提取出来组成一个父类,让这些类继承这个父类也就继承了这些属性和方法,避免了代码冗余,也利于后期维护。继承格式class

2020-09-15 14:28:40 299

原创 深入理解JMM(Java 内存模型)

深入理解JMMMESI缓存一致性协议为什么要有MESI?MESIJMMJava内存模型与硬件内存架构的关系JMM存在的必要性JMM数据原子操作volatile原理与内存语义同步规则MESI缓存一致性协议为什么要有MESI?现在的处理器都是多核处理器,并且每个核都带有多个缓存(指令缓存和数据缓存,见下图)。为什么需要缓存呢,这是因为CPU访问内存的速度比较慢,所以在CPU和内存之间加了个缓存以提高访问速度。既然每个核都有缓存,那么假设两个核或者多个核同时访问同一个变量时这些缓存是如何进行同步的呢(缓存细

2020-09-03 06:20:06 879

原创 常见GC算法介绍

GC四大算法概述引用计数法复制算法(Copying)标记清除(Mark-Sweep)标记压缩算法(Mark-Compact)总结概述JVM在进行GC时,并非每次都对上面三个内存区域一起回收的,大部分时候回收的都是指新生代。因此GC按照回收的区域又分了两种类型,一种是普通GC(minor GC),一种是全局GC(major GC or Full GC)。Minor GC和Full GC的区别普通GC(minor GC):只针对新生代区域的GC,指发生在新生代的垃圾收集动作,因为大多数Java对象存活

2020-09-01 17:34:05 1525

原创 JVM:堆(Heap)

堆(Heap)堆堆的GC过程JVM堆的参数调优堆一个JVM实例只存在一个堆内存,堆内存的大小是可以调节的。类加载器读取了类文件后,需要把类、方法、常变量放到堆内存中,保存所有引用类型的真实信息,以方便执行器执行,堆内存在逻辑上分为三部分:Young Generation Space 新生区Tenure generation space 养老区Permanent Space 永久区新生区 又 由伊甸区、幸存0区和幸存1区 组成。实际而言,方法区(Method

2020-08-31 16:33:25 382

原创 JVM:Java虚拟机栈

Java虚拟机栈JVM栈栈帧(Stack Frame)局部变量表操作数栈动态链接方法返回地址JVM栈Java虚拟机栈主管Java程序的运行,是在线程创建时创建,它的生命期是跟随线程的生命期,线程结束栈内存也就释放,对于栈来说不存在垃圾回收问题,只要线程一结束该栈就Over,生命周期和线程一致,是线程私有的。8种基本类型的变量+对象的引用变量+实例方法都是在函数的栈内存中分配。JVM栈以栈帧为单位进行存储,每个方法在执行的时候都会在栈中创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法返回地址等

2020-08-31 00:33:22 267

原创 JVM:Method Area (方法区)

Method Area方法区类信息永久代元空间元空间内存管理移除永久代的影响运行时常量池方法区方法区是供各线程共享的运行时内存区域。它存储了每一个类的结构信息,例如运行时常量池(Runtime Constant Pool)、字段和方法数据、构造函数和普通方法的字节码内容。方法区是一种JVM规范的抽象概念。可以把方法区理解为Java中定义的一个接口,元空间/永久代是Hotspot针对该规范进行的实现。在Java官方的HotSpot 虚拟机中,在Java7以及之前的版本,是用永久代实现的方法区;Java8

2020-08-30 17:21:58 305

原创 JVM:程序计数器(Program Counter Register)

程序计数器什么是PC寄存器执行流程作用特点什么是PC寄存器程序计数器(Program Counter Register)是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。                                        

2020-08-30 02:28:42 233

原创 JVM:Native Method Stack(本地方法栈)

Native Method StackNative Method Stack定义作用JVM怎样使Native Method 是如何跑起来的特性Native Method Stack定义Native Method Stack本地方法栈 与 java 虚拟机栈 很相似;java 虚拟机栈是为虚拟机执行java方法(字节码文件)服务的,而Native Method Stack的服务对象是 Native方法。Native方法有 Native Method Stack调用和管理。本地接口Native Inte

2020-08-30 01:12:53 179

原创 JVM:解析 类装载器ClassLoader

类装载器ClassLoaderJVM的位置ClassLoader双亲委派机制沙箱安全机制JVM的位置JVM就是java虚拟机,它是一个虚构出来的计算机,可在实际的计算机上模拟各种计算机的功能。JVM是运行在操作系统之上的,它与硬件没有直接的交互。作用:JVM是java字节码执行的引擎,还能优化java字节码,使之转化成效率更高的机器指令。JVM中类的装载是由类加载器和它的子类来实现的,类加载是java运行时一个重要的系统组件,负责在运行时查找和装入类文件的类。不同的平台对应着不同的JVM,在

2020-08-29 15:35:13 144

原创 死锁编码及定位分析

死锁编码及定位分析死锁概念死锁编码定位分析死锁概念死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉那它们都将无法推进下去,如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。产生死锁的主要原因:系统资源不足进程运行推进的顺序不合适资源分配不当死锁编码public class DeadLockDemo { public static void main(String[] args

2020-08-28 16:56:19 163

原创 线程池中如何配置合理的参数

线程池配置合理的参数自定义线程池如何配置合理的参数自定义线程池在实际开发中,基本上都会使用自定义的线程池,而不会使用Executors中JDK提供的线程池。为什么不适用自带的呢?参考阿里巴巴java开发手册线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。 说明:使用线程池的好处是减少在创建和销毁线程上所消耗的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。线程池不允许使用Executors去创建

2020-08-28 16:30:00 1542

原创 线程池ThreadPoolExecutor的使用与原理

线程池ThreadPoolExecutor的使用与原理为什么使用线程池,其优势基本概念优势线程池如何使用架构实现编码实现1. Executors.newFixedThreadPool(int)2. Executors.newSingleThreadExecutor()3. Executors.newCachedThreadPool()线程池的七大参数底层工作原理为什么使用线程池,其优势基本概念线程池的工作主要是控制运行的线程的数量,处理过程中将任务加入队列,然后在线程创建后启动这些任务,如果线程超过了

2020-08-28 14:49:20 151

原创 阻塞队列BlockingQueue 介绍与使用

阻塞队列什么是BlockingQueueBlockingQueue的优点BlockingQueue核心方法框架及种类框架介绍ArrayBlockingQueuelinkedBlockingQueueSynchronousQueue应用场景什么是BlockingQueue阻塞队列,顾名思义,首先它是一个队列,而一个阻塞队列在数据结构中所起的作用大致如图所示 :线程1往阻塞队列中添加元素二线程2从队列中移除元素当阻塞队列是空时,从队列中获取元素的操作将会被阻塞当阻塞队列是满时,往队列中添加元素的操

2020-08-27 17:39:55 940

原创 CountDownLatch、CyclicBarrier、Semaphore 介绍与案例

CountDownLatch、CyclicBarrier、SemaphoreCountDownLatch案例CyclicBarrier构造方法案例Semaphore案例CountDownLatchCountDownLatch倒计时锁(闭锁):是一个同步的工具类,使一个线程阻塞,等待其他线程都运行结束后再被唤醒。与它一同的工具类还有CyclicBarrier、Semaphore、concurrentHashMap和BlockingQueue。CountDownLatch主要有两个方法,当一个或多个线程调

2020-08-26 23:46:11 233

原创 独占锁 / 共享锁、读写锁

独占锁 / 共享锁、读写锁独占锁和共享锁读写锁案例如下独占锁和共享锁独占锁: 指该锁一次只能被一个线程所持有。对ReentrantLockSynchronized而言都是独占锁。共享锁: 指該锁可被多个线程所持有。读写锁ReadWriteLock是一个读写锁接口,ReentrantReadWriteLock类(可重入读写锁)是读写锁ReadWriteLock的一个实现类;ReentrantReadWriteLock可重入读写锁有两种模式,其写模式writeLock())是一个独占锁,其读模式(r

2020-08-26 17:45:20 347

原创 简单介绍 自旋锁SpinLock

自旋锁SpinLock什么是自旋锁自旋锁实现什么是自旋锁自旋锁 是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁。优点:减少线程的阻塞以及线程上下文切换的的消耗。常规锁在线程获取不到锁的时候会阻塞挂起,一直等待唤醒,而从挂起到唤醒是需要经过内核态到用户态的相互转换,这样的上下文切换使性能下降。缺点:循环会消耗CPU。如果线程长期的获取不到锁,那么会一直循环,会消耗CPU。自旋锁实现自旋锁的实现需要借助CAS,因为需要通过CAS来判断当前持有锁的线程是否为null或自身。publ

2020-08-26 16:43:22 365

原创 可重入锁:synchronized & ReentrantLock

可重入锁什么是可重入锁?可重入锁的意义:非可重入锁会发生什么情况呢?Synchronized & ReentrantLocksynchronized案例ReentrantLock案例什么是可重入锁?可重入锁 又叫 递归锁,指当一个线程已经获得某个锁,可以再次获取锁而不会出现死锁。什么意思呢?同一个线程外层函数获得锁之后,内层递归函数也想要获得该锁,那么这个线程可以重复的获取该锁,即上了多把锁。可重入锁的意义:同一个线程多次获取锁,而不会出现死锁。非可重入锁会发生什么情况呢?当一个线

2020-08-26 15:35:24 191

原创 JUC:公平锁和非公平锁

公平锁和非公平锁什么是公平锁和非公平锁公平锁和非公平锁区别是什么什么是公平锁和非公平锁公平锁:当一个线程想要去获取锁时,发现该锁已经被另一个线程占用,那么该线程就要放入一个FIFO等待队列中等待,当持有锁的线程使用完时释放锁后,再根据队列的先后顺序唤醒一个线程去持有锁。即线程持有锁的顺序要讲先来后到,不能插队。非公平锁:当一个线程想要去获取锁时,发现该锁已经被另一个线程占用,那么该线程就试图去获取锁,如果获取成功就持有锁,获取失败就回到等待队列当中等待。指多个线程获取锁的顺序并不是按照申请锁的顺序

2020-08-25 02:51:35 269

原创 一遍了解 值传递和引用传递

值传递和引用传递基本类型对象类型案例案例分析案例1案例2案例3对于java变量的传递到底是传递值还是传递引用,一般而言,基本类型的变量是值传递;对象类型的变量是引用传递。其实引用传递也是传递的值,别懵,看完就懂!基本类型就基本类型int而言,变量a存放的就是字面值3 int a = 3; int b = a; //将a 的值复制一份,再赋值给b; a = 5;//重新修改a的值最终a和b的值为:a = 5;b = 3;b = a,其实就是把a的值拷贝一份,然后再赋值给b;因此a和

2020-08-25 01:36:07 181

原创 JUC:非线程安全的集合类

JUC:非线程安全的集合类故障现象导致原因解决方案VectorCollectionsCopyOnWrite容器故障现象ArrayList、HashMap、HashSet集合都不是线程安全的集合。在简单的单线编程过程中并不会发现这些集合类会出现什么线程相关的错误,而在多线程并发编程过程中如果多个线程并发的操作这些集合可能会报这样的错:java.util.ConcurrentModificationException表示并发修改异常导致原因并发争抢修改导致,参考我们的花名册签名情况。一“个人正

2020-08-24 02:13:08 353

原创 解析CAS算法原理

解析CAS算法原理什么是CAS?CAS原理概念实现形式底层原理案例CAS的缺点什么是CAS?CAS,全称Compare And Swap,顾名思义,比较再交换。它是一种常用于解决并发编程问题的一种思想。它是一条CPU并发原语。它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的。CAS原理概念CAS并发原语体现在JAVA语言中就是sun.misc.Unsafe类中的各个方法。调用UnSafe类中的CAS方法,JVM会 帮我们实现出CAS汇编指令。这是一种完全依赖于

2020-08-23 01:11:30 1566

原创 JUC: 浅析Volatile关键字

Volatile关键字        在讲解Volatile关键字关键字之前,我们先来引入一些概念,有助于后续的理解。        JVM(java内存模型)规定:多于多个线程共享的变量,存储在主内存当中,每个线程都有自己独立的工作内存,并且线程只能访问自己的工作内存,不可以访问其他线程的工作内存。   &nbs

2020-08-21 02:41:11 239

原创 Linux 中对 系统级I/O 的初步理解

系统级I/O打开和关闭文件读和写文件读取文件元数据共享文件I/O重定向所有的I/O设备(例如网络,磁盘和终端)都被模型化为文件,而所有的输入输出都被当做对应文件的读和写来执行。输入/输出(I/O)是在主存外部设备(例如磁盘驱动器,终端和网络)之间复制的过程。输入操作: 从I/O设备复制到主存。输出操作: 从主存复制数据到I/O设备。打开和关闭文件进程是通过调用open函数来打...

2019-12-02 16:06:56 342

原创 linux中对fork()的初步理解

一,fork()初识介绍fork系统调用用于创建一个新的进程,称为子进程,它与进程(系统调用fork的进程)同时运行,此进程称为父进程。创建新的进程后,然后把父进程的所有值都复制到新的子进程中,只有少数值与原来的进程的值不同。相当于克隆了一个父进程。两个进程执行fork()系统调用之后的下一条指令。fork()返回值fork()会返回一个整数值,下面是fork()返回的不同值。fork(...

2019-11-06 00:13:25 1527

原创 第七章:链接--可执行目标文件

可执行文件生成概述程序的转换处理过程一,预处理. 预处理命令-$gcc -E hello.c -o hello.i-$cpp hello.c > hello.i. 处理源文件中以"#“开头的预编译指令,包括:-删除"define"并展开所定义的宏-处理所以条件预编译指令,如”#if",“ifdef”,“endif"等-插入头文件到”#include"处,可以递...

2019-10-05 21:16:56 774

空空如也

空空如也

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

TA关注的人

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