- 博客(24)
- 收藏
- 关注
原创 多线程并发知识
多线程并发多线程相关问题进程是程序运行的实例。运行一个Java程序的实质就是启动一个java虚拟机进程。进程是程序向操作系统申请资源的基本单位。线程是进程中可独立执行的最小单位。一个进程可以包括多个线程,同一个进程中的所有线程共享该进程的资源。竞态:多线程编程中一个问题,对于同样的输入,程序的输出有时是正确的,有时是错误的,这种计算结果的正确性与时间有关的现象被成为竞态。线程安全和非线程安全: 一个类在单线程环境下能够正常运行,并且在多线程环境下,使用方不做特别处理也能运行正常,我们就称其实线程安全
2020-08-13 15:07:03 149
原创 计算机网络(传输层,应用层)
网络模型与相关协议:OSI七层模型:物理层,数据链路层,网络层,运输层,会话层,表示层, 应用层。TCP/IP5层模型:物理层,数据链路层,网络层,运输层,应用层。TCP/IP4层模型:网络接口层,网络层(IP),运输层(TCP/UDP),应用层(HTTP)。常见应用层协议:DNS,HTTP, SMTP, POP3(接受文件),FTP,Telent远程终端协议。传输层:TCP,UDP; 网络层:ICMP,IGMP,IP可以这样做,在OSI模型中ARP协议属于链路层;而在TCP/IP模型中,ARP
2020-08-13 15:06:07 1349
原创 MySQL知识
MySQL事务相关数据库的事务事务:一组数据库操作,要么全都执行,要么都不执行;事务特性:ACID. 原子性:事务是最小的执行单位,不可分割,保证事务要么都完成,要么都不完成。一致性:???执行事务前后,数据保持一致。隔离性:并发访问数据库时:一个事务不被其他事务干扰。持久性:事务一 旦提交,对数据库的改变是持久的并发事务带来的问题:脏读:一个事务读取了另一个事务修改但未提交的数据。丢失修改:数据被两个事务连续修改,第一个事务的修改丢失了。不可重复读,一个事务连续读两次数据,但结果不一样。
2020-08-13 15:04:53 165
原创 JVM知识
JVM内存线程私有:PC程序计数器,虚拟机栈,本地方法栈 线程共享:堆,方法区,直接内存PC:下一条执行字节码指令的地址,唯一不会发生OutOfMemory的地方;虚拟机栈:线程私有,生命周期和线程一致;存在局部变量表(基本数据类型和引用类型变量),操作数栈,动态链接,方法出口信息。两种异常:当栈的深度超过最大申请申请深度时,StackOverFlowError;内存不够Java虚拟机栈动态扩展时,OutOfMemory;栈中存放的是栈帧,一个函+数一个栈帧;本地方法栈,存放本地方法的栈,
2020-08-13 15:04:01 125
原创 Redis相关知识要点
RedisRedis,key-Value类型的内存数据库,整个数据库系统在内存中操作,定期异步flush到硬盘上进行保存。常用于缓存,也可以作分布式锁。redis提供多种数据类型,支持事务,两种持久化方式,多种集群方案。Redis为什么要作为缓存? 高性能和高并发:高性能:用户第一次访问数据库时,是从硬盘上读取的,过程比较慢,效率比较低。redis作为缓存,将用户访问的诗句存在缓存中,下一次再访问这些数据时就可以直接从缓存中读取了,操作缓存就是直接存在内存,速度特别快。高并发:直接操作缓存所能承受的
2020-08-13 15:02:49 199
原创 有关HashMap的问题
1:HashMap 的数据结构?A:哈希表结构(链表散列:数组+链表)实现,结合数组和链表的优点。当链表长度超过 8 时,链表转换为红黑树。transient Node<K,V>[] table;2:HashMap 的工作原理?HashMap 底层是 hash 数组和单向链表实现,数组中的每个元素都是链表,由 Node 内部类(实现 Map.Entry接口)实现,HashMap 通过 put & get 方法存储和获取。存储对象时,将 K/V 键值传给 put() 方法:①、
2020-08-11 14:17:50 112
原创 Redis数据结构——压缩列表
1、压缩列表是列表键和哈希键的底层实现之一2、每个压缩列表节点都又previous_entry_length、encoding、content组成。previous_entry_length记录前一个节点的长度(方便用指针找到前一个节点的起始地址,在从表尾向表头遍历起作用);encoding记录所保存数据的类型和长度;content记录节点的值。3、对压缩列表中的结点删除或者增加都会引起连锁更新,但这样的操作出现的几率不高...
2020-06-26 22:27:10 92
原创 Redis数据结构——整数集合
1、整数集合是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现。2、整数集合的底层实现为数组,这个数组以有序、无重复的方式保存集合元素,在有需要时,程序会根据新增加元素的类型,改变这个数组的类型。3、升级操作会为整数集合带来操作上的灵活性,并且尽可能地节约内存。4、整数集合只支持升级操作,不支持降级操作。...
2020-06-26 22:16:18 136
原创 Redis数据结构——跳跃表
跳跃表是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。Redis使用跳跃表作为有序集合键的底层实现之一,如果一个有序集合包含的元素数量比较多,又或者有序集合中的元素的成员是比较长的字符串时,Redis就会使用跳跃表作为有序集合键的底层实现。Redis的跳跃表又redis.h/zskiplistNode和redis.h/zskiplist两个结构定义,其中zskiplistNode结构用于表示跳跃表节点,而zskiplist结构用于保存跳跃表节点的相关信息,比
2020-06-26 19:19:33 137
原创 Redis数据结构——字典
字典在Redis中的应用相当广泛,Redis的数据库就是使用字典来作为底层实现的,对数据库的增删改查操作也是构建在对字典的操作之上的。举个例子,当我们执行命令:redis》 SET msg “hello world”ok在数据库中创建一个键为" msg ",值为“hello world”的键值对时,这个键值对就保存在代表数据库的字典里面的。除了用来表示数据库之外,字典还是哈希键的底层实现之一,当一个哈希键包含的键值对比较多,或者键值对的中的元素都是比较长的字符串时,Redis就会使用字典作为哈希键
2020-06-26 16:37:50 118
原创 Redis数据结构——链表
列表键的底层实现之一就是链表,当一个列表键包含了数量比较多的元素,或者列表中包含的元素都是比较长的字符串时,Redis就会使用链表作为列表键的底层实现。Redis的链表实现的特性可以总结如下:1、双端:链表结点带有prev和next指针,获取某个节点的前置节点和后置节点的复杂度都是O(1)2、无环:表头节点的prev和表尾节点的next指针都指向NULL,对链表的访问以NULL为终点3、待表头和表尾指针,获取链表的表头节点和表尾节点的复杂度为O(1)4、带链表长度计数器,通过结构中的len属性可以
2020-06-26 16:17:33 87
原创 Redis之简单动态字符串(SDS)
Redis没有直接使用C语言传统的字符串表示,而是自己构建一种名为简单动态字符串(SDS)的抽象类型,并将SDS用作redis的默认字符串表示。在Redis的数据库中,包含字符串值得键值对在底层都是又SDS实现的。比如reids> SET msg “hello world”ok在客户端中执行这样的命令,redis将在数据库中创建一个新的键值对,其中:键值对的键是一个字符串对象,对象的底层实现是一个保存着字符串“msg”的SDS。键值对的值也是一个字符串对象,对象的底层实现是一个保存着字符
2020-06-24 21:47:47 212
原创 行为型模式之观察者模式
观察者模式用于描述对象之间的依赖关系,它引入了观察者和观察目标两类不同的角色,并且提供抽象层,使得增加新的观察者和观察目标都很方便。模式定义:对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象都得知通知并自动更新。观察者模式又叫做 发布-订阅模式、模型-视图模式、源-监听器模式或从属者模式。观察者模式是一种对象行为型模式。代码实现:(1) 抽象目标类public abstract class MyuSubject{ protected ArrayList obs
2020-06-22 19:09:56 125
原创 结构型设计模式之装饰模式
定义:动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类更灵活代码实现:(1)抽象构建类 public interface Transform{ public void move();}(2)具体构建类public final class Car implememts Transform{ public Car{ System.out.println("变形金刚是一辆车");} public void m
2020-06-21 20:17:29 170
原创 结构型模式之组合模式
定义:组合多个对象形成树形结构以表示“部分-整体”的结构层次。代码实现:(1)抽象构建类 public abstract class MyElement{ public abstract void eat();}(2)叶子构建类public class Apple extends MyElement{ public void eat{ System.out.println("吃苹果");}}(2)叶子构建类public class pear
2020-06-21 19:52:20 104
原创 结构型设计模式之桥接模式
模式定义:将抽象部分与它的实现部分分离,使它们都可以独立的变化。代码实现:(1)实现类接口Colorpublic interface Color{ void bepaint(String penType,String name); }(2)具体实现类Red(可以扩展多个具体实现类)public class Red implements Color{ public void bepaint(penType+"红色的"+"name");}(3)抽象类public
2020-06-21 19:08:28 110
原创 结构型模式之适配器模式
如果在系统中存在不兼容的接口,可以通过引入一个适配器来使得原本因为接口不兼容而不能一起工作的两个类可以协同工作。适配器模式包括类适配器和对象适配器。类适配器代码实现:(1)目标抽象类public interface Robot{ public void cry(); public void move();}(2)适配者类public class Dog{ public void wang() { System.out.println("狗汪汪叫");
2020-06-21 17:36:05 145
原创 创建型模式之抽象模式
在工厂方法中,具体工厂只需要生产一种具体产品,但是在抽象工厂模式中,具体工厂可以生产相关的一组具体产品,这样的一组产品称之为产品族,产品族中每一个产品都分属于某一个产品继承等级结构**抽象工厂模式是工厂方法模式的泛化版,工厂方法模式是一种特殊的抽象工厂模式。在工厂方法模式中,每一个具体的工厂只能生产一种具体的产品,而在抽象方法模式中,每一个具体工厂可以生产多个具体产品。代码实现:(1)抽象产品类public interface Television{public void play();}
2020-06-21 15:34:37 111
原创 创建型模式之工厂方法模式
工厂方法模式引入了抽象的工厂类,而将具体产品的创建过程封装在抽象工厂类的子类,也就是具体工厂类中。客户端代码针对抽象层进行编程,增加新的具体产品类时只需要增加一个相应的具体工厂类即可,使得系统具有更好的灵活性和可扩展性。代码实现:(1)抽象产品类 public Interface TV{ public void play();}(2)具体产品类: public class HaierTV implements TV{ public void play(){
2020-06-21 14:09:13 93
原创 创建型模式之简单工厂模式
模式定义:又称为静态工厂方法模式,属于类创建型模式。(1)抽象产品类 public interface TV{ public void play(); }(2)具体产品类 public class HaierTV implements TV { public void play(){ System.out.println("海尔电视机播放中"); } }(3)具体产品类 public class HisenceTV
2020-06-21 12:23:00 124
原创 创建型模式之单例模式
单例模式(Singleton Pattern):单例模式确保其某一类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类成为单例类,它提供全局访问的方法。一般 情况下,单例模式的实现代码如下:在单例模式的实现过程中,需要注意如下三点:(1)单例类的构造函数为私有;(2)提供一个自身静态私有成员变量;(3)提供一个公有的静态工厂方法。代码实现:1、懒汉式单例,线程不安全,私有静态变量 instance被延迟实例化,这样做的好处是,如果没有用到该类,那么就不会实例化 instance,从而
2020-06-21 11:47:16 74
原创 面向对象设计原则
常用的面向对象设计原则包括7个,包括单一职责原则,开闭原则,里氏代换原则,依赖倒转原则,接口隔离原则,合成复用原则,迪米特法原则等。一,单一职责原则:定义:一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。为什么要单一职责原则:因为如果职责太多,将导致系统非常脆弱,一个职责可能会影响其他职责,因此要将这些职责进行分离,将不同的职责封装在不同的类中,即将不同的变化原因封装在不同的类中。单一职责原则是实现高内聚,低耦合的指导方针,在很多代码重构手法中都能找到它的存在。二、开闭原则:定
2020-06-17 12:56:43 96
原创 JVM类加载机制
(加载-验证-准备-解析-初始化-使用-卸载) 加载:一,通过一个类的全限定名来获取定义此类的二进制字节流;二,将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构;三,在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据访问入口。验证:连接阶段的第一步,确保Class文件的字节流中包含的信息符合约束要求,保证这些信息被当做代码运行后不会危害虚拟机的安全:一, 文件格式验证:验证字节流是否符号Class文件格式规范二, 元数据验证:针对方法区的存储结构
2020-06-08 11:42:19 55
原创 java并发知识
关键字Synchronized:语义底层是通过一个monitor来完成的。Jvm基于进入和退出Monitor对象来实现方法同步和代码块同步,但两者的实现细节不一样。代码块同步是使用monitorenter和monitorexit指令实现的,而方法同步是使用另外一种方式实现(依靠方法修饰符上的ACC_SYNCHRONIZED),但是,方法同步同样可以使用这两个指令实现。无论哪种方式,其本质是对一个对象的监视器(monitor)进行获取,而这个获取过程是排他的,也就是同一时刻只能有一个线程获取到又synch
2020-06-08 11:35:25 71
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人