自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 Synchronized关键字和锁升级,详细分析偏向锁和轻量级锁的升级

1、锁升级 锁的4中状态:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态(级别从低到高) (1)偏向锁: 为什么要引入偏向锁? 因为经过HotSpot的作者大量的研究发现,大多数时候是不存在锁竞争的,常常是一个线程多次获得同一个锁,因此如果每次都要竞争锁会增大很多没有必要付出的代价,为了降低获取锁的代价,才引入的偏向锁。 偏向锁的升级 当线程1访问代码块并获取锁对象时,会在java对象头和栈帧中记录偏向的锁的threadID,因为偏向锁不会主动释放锁,因此以后线程1再次获取锁的时候,需要比较当前线程的th

2020-08-17 14:20:33 385 2

原创 DDD总结

DDD淘宝:其他。

2023-06-24 09:44:17 336

转载 操作系统(二)

第三章:处理机调度与死锁 1、处理机调度的三个层次 高级调度(也称为作业调度、宏观调度、长程调度):用于决定外存上处于后备队列中的哪些作业调入内存,并为他们创建进程、分配必要的资源,再将新创建的进程排在就绪队列上,准备执行。 作业调度应解决的两个问题: 接纳多少作业? 取决于多道程序度 接纳哪些作业? 取决于所采用的调度算法,如先来先服务调度算法、短作业有限调度算法等 中级调度(又称中程调度):涉及进程在内、外存间的交换,从存储器资源管理的角度来看,把进程的部分或全部换出到外存上,可为当前运行进程

2020-11-03 19:49:07 2132

转载 操作系统(一)

第一章 操作系统引论 1、操作系统是什么? 操作系统为用户完成所有“硬件相关,应用无关“的工作,以给用户方便、高效、安全的使用环境 1.1、定义: 操作系统是一个大型的程序系统,它负责计算机的全部软、硬件资源的分配、调度工作,控制并协调多个任务的活动,实现信息的存取和保护。它提供用户接口,使用户获得良好的工作环境。 1.2、目标 (1)、方便性:配置OS后计算机系统更容易使用 (2)、有效性:改善资源利用率;提高系统 吞吐量 (3)、可扩充性:OSde结构(如层次化的结构:无结构发展->模快化结构-&

2020-11-03 17:27:23 1811

转载 【Linux】目录文件权限的查看和修改

命令: chmod 777 scan_record.js 格式: chmod 权限数字 文件名 r 读权限read 4 w 写权限write 2 x 操作权限execute 1 权限数字对应权限组说明: 总共分为4部分 【文件或文件夹】【owner权限】【group权限】【others权限】 【文件是-,文件夹是d】【r/w/x相加】【r/w/x相加】【r/w/x相加】 Linux档案的基本权限就有九个,分别是owner/group/others三种身份各有自己的read/write/execute

2020-10-25 08:59:10 987

转载 内存溢出和内存泄漏

内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。 内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。 memory leak会最终会导致out ofmemory。 Java 堆内存的OutOfMemoryError异常是实际应用中最常见的内存溢出异常

2020-09-28 20:13:28 326

转载 Java中float、double、long类型变量赋值添加f、d、L尾缀问题

转自:https://blog.csdn.net/FX677588/article/details/52663805 添加尾缀说明   我们知道Java在变量赋值的时候,其中float、double、long数据类型变量,需要在赋值直接量后面分别添加f或F、d或D、l或L尾缀来说明。   其中,long类型最好以大写L来添加尾缀,因为小写l容易和数字1混淆。   例如: long lNum = 1234L; float fNum = 1.23f; double dNum = 1.23d; 这是Jav

2020-09-23 12:44:11 1636

转载 JDBC驱动加载

概述 一般情况下,在应用程序中进行数据库连接,调用JDBC接口,首先要将特定厂商的JDBC驱动实现加载到系统内存中,然后供系统使用。基本结构图如下: 驱动加载入内存的过程 这里所谓的驱动,其实就是实现了java.sql.Driver接口的类。如oracle的驱动类是 oracle.jdbc.driver.OracleDriver.class(此类可以在oracle提供的JDBC jar包中找到),此类实现了java.sql.Driver接口。 由于驱动本质上还是一个class,将驱动加载到内存和加载普通的

2020-09-23 12:37:37 654

转载 java内存区域划分(堆,栈,方法区)

java虚拟机在执行java程序的过程中会把它所管理的内存划分成若干个不同的数据区域。这些区域各有用途,以及创建和销毁的时间。有的区域随着虚拟机的进程的启动而存在,有的则依赖用户线程的启动和结束而建立和销毁。 运行时数据区域 线程共享区:方法区、堆 线程隔离区:虚拟机栈、本地方法栈、程序计数器 java内存区域详解 程序计数器: 是一块较小的内存空间,可以看作当前线程所执行的字节码的行号指示器。 java多线程就是通过对线程的轮流切换并分配处理器的执行时间的方式来实现的,在任意时刻,一个处理器都只会执行某一

2020-09-23 10:45:04 755

转载 java中局部变量、实例变量和静态变量在方法区、栈内存、堆内存中的分配

Java中的变量根据不同的标准可以分为两类,以其引用的数据类型的不同来划分可分为“原始数据类型变量和引用数据类型变量”,以其作用范围的不同来区分可分为“局部变量,实例变量和静态变量”。 根据“Java中的变量与数据类型”中的介绍,“变量是在内存中分配的保留区域的名称。换句话说,它是一个内存位置的名称”,也就是说我们通过这个变量名字就可以找到一个指向这个变量所引用的数据的内存指针,根据变量的类型我们可以知道这个指针之后的几个字节里存储了这个变量所引用的数据。 所以,了解变量在方法区、栈内存、堆内存中的分配要了

2020-09-23 10:17:12 828

转载 MySql优化

转自:https://blog.csdn.net/tiantang_zy/article/details/105156232 1、查询缓存 MySQL Query Cache是用来缓存我们所执行的SELECT语句以及该语句的结果集,MySql在实现Query Cache的具体技术细节上类似典型的KV存储,就是将SELECT语句和该查询语句的结果集做了一个HASH映射并保存在一定的内存区域中。当客户端发起SQL查询时,Query Cache的查找逻辑是,先对SQL进行相应的权限验证,接着就通过Query Ca

2020-09-22 09:21:42 231

转载 如何正确使用redis分布式锁

什么是分布式锁?为什么需要分布式锁? 在java中,在单进程多线程的情况下,为了防止多个线程共同竞争同一个资源,因此需要锁,java中有显示锁和隐式锁来保证,而在多进程的情况下,普通的锁就无法满足要求了,因此我们需要分布式锁,常用的分布式锁解决方案有三种,分别是基于数据库/redis/zookeeper,本文我们主要讨论redis分布式锁. redis分布式锁实现 笔者在面试过程中,问redis分布式锁知识点时的第一个问题就是如何实现一个redis分布式锁,许多候选人直接说,啊,这很简单啊,使用setNx(

2020-09-21 15:33:47 1836

原创 Redis中的内存淘汰机制

Redis过期键的删除策略 定时删除,这个就是大家最熟悉的给Key设置过期时间,创建定时器,让定时器在过期时间到来时删除键和值 惰性删除,指当客户端取键时才检查键是否过期,不主动删除过期的键 定期删除,每隔一段时间检查数据库,删除过期的键 定时删除+惰性删除 目前使用的策略 redis采用的是定期删除+惰性删除混合策略,至于为什么不单纯使用定时删除,那是因为用一个定时器监视key,过期自动删除,虽然实现了内存及时释放,但是这样的操作十分消耗CPU资源,高并发的情况下,CPU主要用来处理请求,而不是删除过

2020-09-21 11:36:34 390

转载 Redis(Java面试题)

一、什么是Redis? Redis是一种高性能的key-value非关系型数据库,他是基于C语言写的,底层采用NIO多路复用机制,使用一个线程去维护多个不同的socket连接,他只有Linux版本的,没有Windows版本的,Windows版本的Redis是网上大神改写的,因为在Windows中NIO多路复用机制底层使用的是selector选择器,通过for循环去遍历连接,容易造成空轮训,效率比较低,而Linux中是采用epoll事件驱动回调机制,主动去调用活跃的socket连接,避免了空轮训,效率比较高。

2020-09-21 11:32:44 216

转载 Redis 操作命令

一、字符串 1 SET key value 设置指定 key 的值 2 GET key 获取指定 key 的值。 3 GETRANGE key start end 返回 key 中字符串值的子字符 4 GETSET key value 将给定 key 的值设为 value ,并返回 key 的旧值(old value)。 5 GETBIT key offset 对 key 所储存的字符串值,获取指定偏移量上的位(bit)。 6 MGET key1 [key2…] 获取所有(一个或多个)给定 key 的值。

2020-09-21 11:21:54 180

转载 面试题(一)

相关概念 面向对象的三个特征 封装,继承,多态.这个应该是人人皆知.有时候也会加上抽象. 多态的好处 允许不同类对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用).主要有以下优点: 可替换性:多态对已存在代码具有可替换性. 可扩充性:增加新的子类不影响已经存在的类结构. 接口性:多态是超类通过方法签名,向子类提供一个公共接口,由子类来完善或者重写它来实现的. 灵活性. 简化性. 代码中如何实现多态 实现多态主要有以下三种方式: 接口实现 继承

2020-09-20 09:47:44 281

转载 new String创建了几个对象

String str = new String(“abc”) 到底创建了几个对象? 首先String str是定义了一个字符串变量,并未产生对象,=不产生对象,那么只有后面的new String(“abc”)了。把它拆分成"abc"和new String(),首先在字符串常量池去寻找有没有"abc"这个字符串,没有就创建一个“abc”字符串对象在栈中,然后new String把这个字符串对象拷贝一份到堆中,返回这个对象的引用。所以一共产生两个对象 试问str变量存储在堆中还是栈中?关键点是区分str是成员

2020-09-19 23:12:35 486

转载 IO流(Java面试题)

1、什么是比特(Bit),什么是字节(Byte),什么是字符(Char),它们长度是多少,各有什么区别 Bit就是比特位,是计算机最小的二进制单位,取值0或1, Byte占有8个比特位, 取值-128~127 Char占有两个字节,16个比特位,取值0~65535 Bit是数据存储最小单位,计算机只认识0和1 Byte是计算机存储容量的基本单位 Char是java的一种基本数据类型 2、什么是流,按照传输的单位,分成哪两种流 JAVA程序中对数据的输入输出称为流 分为字节流和字符流 字节流: inputS

2020-09-19 22:55:56 1497

原创 可重入函数与不可重入函数

在 实时系统的设计中,经常会出现多个任务调用同一个函数的情况。如果这个函数不幸被设计成为不可重入的函数的话,那么不同任务调用这个函数时可能修改其他任 务调用这个函数的数据,从而导致不可预料的后果。那么什么是可重入函数呢?所谓可重入是指一个可以被多个任务调用的过程,任务在调用时不必担心数据是否会 出错。不可重入函数在实时系统设计中被视为不安全函数。 满足下列条件的函数多数是不可重入的: (1)函数体内使用了静态的数据结构; (2)函数体内调用了malloc()或者free()函数; (3)函数体内调用了标准I

2020-09-18 11:21:15 263

转载 存储管理知识点与例题

1、存储器: 速度:寄存器---->主存---->辅存 容量:辅存---->主存---->寄存器 2、高速缓存和磁盘缓存: 高速缓存:解决cpu与主存之间速度不平衡 磁盘缓存:解决主存与磁盘之间速度不平衡,他是内存中开辟的一个区间,并不是实际存在的一个存储器 3、程序的运行过程: 编译、连接、装入 编译:将命名空间编程逻辑地址 链接:链接是指将这组目标模块以及所需的库函数装配成一个完整的装入模块 1、静态链接 2、装入时动态链接 3、运行时动态链接 装入:将模块装入内存 1、绝对装入

2020-09-18 09:08:01 773

转载 存储管理

存储管理功能 存储分配和去配 分配去配对象 内存、外存(相同方法) 分配去配时刻 进程创建、撤销、交换、长度变化(栈溢出, execl) 当处于外存的部分需要调入内存时,操作系统应为其分配内存空间,同时收回外存空间 当处于内存的部分需要调出内存时,操作系统应为其分配外存空间,同时收回内存空间 分配表:记录已经分配的区域 空闲表:记录尚未分配的区域 存储共享: 两个或多个进程共用内存中的相同区域 目的:节省内存、相互通讯 内容:代码、数据 存储保护 防止地址越界:每个进程都具有相对独立的进程空间。如果进程在运

2020-09-17 13:28:40 639

转载 线程同步的四种常用方式

一、 临界区(CCriticalSection) 当多个线程访问一个独占性共享资源时,可以使用临界区对象。拥有临界区的线程可以访问被保护起来的资源或代码段,其他线程若想访问,则被挂起,直到拥有临界区的线程放弃临界区为止。具体应用方式: 1、 定义临界区对象CcriticalSection g_CriticalSection; 2、 在访问共享资源(代码或变量)之前,先获得临界区对象,g_CriticalSection.Lock(); 3、 访问共享资源后,则放弃临界区对象,g_CriticalSectio

2020-09-17 11:03:21 2261

转载 进程间通信的五种方式

进程间通信的意思就是在不同进程之间传递信息。它是一组编程接口,让程序员协调不同进程,使能够相互传递消息。 IPC目的 1)数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。 2)共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。 3)通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。 4)资源共享:多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。 5)进程控

2020-09-17 10:56:11 5031

原创 Linux下的PCB结构体

进程的主要信息: 1、pid_t pid标识符:与进程相关的唯一标识符,区别正在执行的进程和其他进程 2、状态:描述进程的状态,因为进程有阻塞、挂起、运行等好几个状态,所以都有个表示符来记录进程的执行状态。 3、优先级:如果有好几个进程正在执行,就涉及到进程的执行的先后顺序,这和进程的优先级这个标识符有关。 4、程序计数器:程序中即将被执行指令的下一条地址。 5、内存指针:程序代码和进程相关数据的指针。 6、上下文数据:进程执行时处理器的寄存器中的数据。 7、I/O状态信息:包括显示的I/O请求,分配给进程

2020-09-17 10:33:56 1778

转载 进程以及PCB

进程基本概念:进程的产生是因为为了使程序能并发执行,且为了对并发执行的程序加以描述和控制。 进程的结构:程序段、相关的数据段和 PCB (进程控制块Process Control Block)。 进程跟程序是不同的,进程是动态的,程序是静态的,进程有创建,执行,消亡,所以进程实体是有生命周期的,而程序只是一组有序指令的集合。 可以总结一下: (1) 进程是程序的一次执行。 (2) 进程是一个程序及其数据在处理机上顺序执行时所发生的活动。 (3) 进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调

2020-09-17 10:05:39 2217 1

转载 DMA(Direct Memory Access)

1、DMA由来 DMA(Direct Memory Access,直接存储器访问)。在DMA出现之前,CPU与外设之间的数据传送方式有程序传送方式、中断传送方式。CPU是通过系统总线与其他部件连接并进行数据传输。 1.1程序传送方式 程序传送方式是指直接在程序控制下进行数据的输入/输出操作。分为无条件传送方式和查询(条件传送方式)两种。 1.1.1无条件传送方式 微机系统中的一些简单的外设,如开关、继电器、数码管、发光二极管等,在它们工作时,可以认为输入设备已随时准备好向CPU提供数据,而输出设备也随时准备

2020-09-15 14:49:48 1465

转载 NIO相关基础

用户空间以及内核空间概念 我们知道现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操心系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核,保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较低的3G字节(

2020-09-15 14:33:46 161

转载 死锁以及处理策略

什么是死锁? 所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。 因此我们举个例子来描述,如果此时有一个线程A,按照先锁a再获得锁b的的顺序获得锁,而在此同时又有另外一个线程B,按照先锁b再锁a的顺序获得锁。如下图所示: 产生死锁的原因? 可归结为如下两点: a. 竞争资源 系统中的资源可以分为两类: 可剥夺资源,是指某进程在获得这类资源后,该资源可以再被其他进程或系统剥夺,CPU和主存均属于可剥夺性资源; 另一类资源是不可剥夺资

2020-09-15 10:26:59 625

转载 Linux下的I/O复用与epoll详解

前言 I/O多路复用有很多种实现。在linux上,2.4内核前主要是select和poll,自Linux 2.6内核正式引入epoll以来,epoll已经成为了目前实现高性能网络服务器的必备技术。尽管他们的使用方法不尽相同,但是本质上却没有什么区别。本文将重点探讨将放在EPOLL的实现与使用详解。 为什么会是EPOLL select的缺陷 高并发的核心解决方案是1个线程处理所有连接的“等待消息准备好”,这一点上epoll和select是无争议的。但select预估错误了一件事,当数十万并发连接存在时,

2020-09-15 09:56:10 181

转载 Redis为什么是单线程、及高并发快的大原因详解

一、Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快(纯内存)。 2.redis是单线程的,省去了很多上下文切换线程的时间(避免线程切换和竞态消耗)。 3.redis使用多路复用技术,可以处理并发的连接(非阻塞IO)。 非阻塞IO 内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间。 下面重点介绍单线程设计和IO多路复用核心设计快的原因。 二、为什么Red

2020-09-15 09:25:22 1041

转载 select,poll,epoll

缓存I/O 缓存I/O又称为标准I/O,大多数文件系统的默认I/O操作都是缓存I/O。在Linux的缓存I/O机制中,操作系统会将I/O的数据缓存在文件系统的页缓存中,即数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。 五种IO模型 阻塞式I/O模型:默认情况下,所有套接字都是阻塞的。recvfrom等待数据准备好,从内核向进程复制数据。 非阻塞式I/O: 进程把一个套接字设置成非阻塞是在通知内核,当所请求的I/O操作非得把本进程投入睡眠才能完成时,不要把进程

2020-09-15 09:07:39 135

转载 IO设计模式:Actor、Reactor、Proactor

先介绍两种高性能服务器模型Reactor、Proactor Reactor模型: 1 向事件分发器注册事件回调 2 事件发生 4 事件分发器调用之前注册的函数 4 在回调函数中读取数据,对数据进行后续处理 Reactor模型实例:libevent,Redis、ACE Proactor模型: 1 向事件分发器注册事件回调 2 事件发生 3 操作系统读取数据,并放入应用缓冲区,然后通知事件分发器 4 事件分发器调用之前注册的函数 5 在回调函数中对数据进行后续处理 Preactor模型实例:ASIO react

2020-09-15 08:53:58 875

转载 IO多路复用机制

服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型。 (2)同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。注意这里所说的NIO并非Java的NIO(New IO)库。 (3)IO多路复用(IO Multiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO,Java中的Selector和Linux中的epoll都是这种模型

2020-09-15 08:43:10 198

转载 mmap的解析

前言 看这篇文章之前需要知道一个概念 虚拟内存系统通过将虚拟内存分割为称作虚拟页(Virtual Page,VP)大小固定的块,一般情况下,每个虚拟页的大小默认是4096字节。同样的,物理内存也被分割为物理页(Physical Page,PP),也为4096字节。 一、mmap基本原理和分类 在LINUX中我们可以使用mmap用来在进程虚拟内存地址空间中分配地址空间,创建和物理内存的映射关系。 映射关系可以分为两种 1、文件映射 磁盘文件映射进程的虚拟地址空间,使用文件内容初始化物理内存。 2、匿名映射

2020-09-15 08:28:13 1174

转载 Java异常和克隆

1.Error和Exception的联系 继承关系:Error和Exception都是继承于Throwable,RuntimeException继承自Exception。 Error和RuntimeExceptime及其子类被称为未检查异常(Unchecked exception),其它异常称为受检查异常(Checked Exception)。 2.Error和Exception的区别 Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存不足,方法调用栈溢出等。如Java.lang.Stac

2020-09-11 16:58:43 525

转载 JVM原理讲解和调优

一、什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Jav

2020-09-11 16:30:13 399

转载 SQL中ON和WHERE的区别

摘自:https://www.cnblogs.com/guanshan/articles/guan062.html 数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。 在使用left jion时,on和where条件的区别如下: 1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。 2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真

2020-09-10 10:29:33 445

转载 SQL中的连接方式

sql语句中的连接方式 两张表 部门表(dept)和员工表(usert)中所有的数据 1.–左连接 usert(员工表) dept(部门表) –显示员工信息时,有的员工可能还没有分配到某个具体的部门(新进员工),其所属部门一项就没有数据,但是员工仍然需要显示,即员工表数据需要全部显示 select u.name,d.deptname from usert u left join dept d on u.deptid=d.deptid order by u.id 2.–右连接 –新部门还没有员工,显示时

2020-09-10 09:52:18 1163

转载 内部类

摘自牛客网网友答案 1.为什么使用内部类? 使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现, 对于内部类都没有影响 1.1.使用内部类最大的优点就在于它能够非常好的解决多重继承的问题,使用内部类还能够为我们带来如下特性: (1)、内部类可以用多个实例,每个实例都有自己的状态信息,并且与其他外围对象的信息相互独。 (2)、在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或者继承同一个类。 (3)、创建内部类对象的时刻并不依赖于

2020-09-09 16:55:28 132

原创 JVM内存图总览

2020-09-09 16:25:57 165

空空如也

空空如也

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

TA关注的人

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