自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 java.util.concurrent——Java并发包深度解析

创建线程的方法:继承thread类(缺点:如果一个类已经有父类)、实现runnable接口(可以解耦)、使用线程池线程池好处:第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。第四:Java1.5中引入的Executor框架把任务的提交和执行进行解耦,只需要定义

2021-09-25 20:41:01 498

原创 Spring原理深度解析(三)——Spring MVC实现

在启动过程中,spring会使用一个默认的WebApplicationContext实现作为IoC容器。这个默认使用的IoC容器就是XMLWebApplicationContext。对于spring承载的web应用而言,可以指定在web应用程序启动时载入IoC容器(或者称为WebApplicationContext)。这个功能是由ContextLoaderListener这样的类来完成的,它是在web容器中配置的监听器(配置在web.xml中)。这个ContextLoader就像spring应用程序在web

2021-09-18 21:55:37 193

原创 Spring原理深度解析(二)——Spring AOP实现

AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代码被称为

2021-09-15 21:07:09 163

原创 java.lang.reflect.Proxy——Java动态代理深度解析

代理分为静态代理和动态代理,静态代理是在编译时就将接口、实现类、代理类一股脑儿全部手动完成,但如果我们需要很多的代理,每一个都这么手动的去创建实属浪费时间,而且会有大量的重复代码,此时我们就可以采用动态代理,动态代理可以在程序运行期间根据需要动态的创建代理类及其实例,来完成具体的功能。Proxy.newProxyInstance()方法利用参数中的classLoader生成字节码文件并动态生成代理类ProxyN,这个类继承了Proxy并且实现了传入的一组接口,循环遍历传入接口中的每一个方法,将方法设置到P

2021-09-15 10:16:21 1406

原创 Spring原理深度解析(一)

Spring IoC实现(解耦)BeanFacotry是spring中比较原始的Factory。如XMLBeanFactory就是一种典型的BeanFactory。原始的BeanFactory无法支持spring的许多插件,如AOP功能、Web应用等。ApplicationContext接口,它由BeanFactory接口派生而来,因而提供BeanFactory所有的功能。ApplicationContext以一种更向面向框架的方式工作以及对上下文进行分层和实现继承IoC容器BeanFactory(基

2021-09-14 20:35:58 164

原创 JDK与JRE

JDK与JREJre 是java runtime environment, 是java程序的运行环境。既然是运行,当然要包含jvm,还有所有java类库的class文件(包括java.lang包、java.util包等),都在lib目录下打包成了jar。java命令属于jreJDK(java development kit)主要包含三部分,第一部分就是Java运行时环境,JVM。第二部分就是Java的基础类库,这个类库的数量还是非常可观的。第三部分就是Java的开发工具,它们都是辅助你更好的使用J

2021-09-14 20:30:01 88

原创 Java Reflect——Java反射机制详解

反射反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象,的方法的功能称为java语言的反射机制。(如在运行状态中(正在运行的服务器,不用关了服务器再修改),修改配置文件,切换不同的数据库)不用类名也可以获得class对象,this.getClass()方法,不能再static方法中使用。在java虚拟机规范中,必须开始初始化的情况之一就是调用Class.forName()。而加载、验证、准备

2021-09-14 19:27:23 178

原创 Thread——线程的生命周期

线程的生命周期可以分为四个状态:1.创建状态:  当用new操作符创建一个新的线程对象时,该线程处于创建状态。  处于创建状态的线程只是一个空的线程对象,系统不为它分配资源。2.可运行状态:  执行线程的start()方法将为线程分配必须的系统资源,安排其运行,并调用线程体——run()方法,这样就使得该线程处于可运行状态(Runnable)。  这一状态并不是运行中状态(Running),因为线程也许实际上并未真正运行。3.不可运行状态:  当发生下列事件时,处于运行状态的线程会转入到不.

2021-09-14 18:52:10 694

原创 Class and ClassLoader——Java类与类加载器

类加载器用于实现类的加载动作类加载器按照层次,从顶层到底层,分为以下三种:(1)启动类加载器(Bootstrap ClassLoader)(c++实现,其他加载器都是java实现)这个类加载器负责将存放在JAVA_HOME/lib下的,或者被-Xbootclasspath参数所指定的路径中的,并且是虚拟机识别的类库加载到虚拟机内存中。启动类加载器无法被Java程序直接引用。(2)扩展类加载器(Extension ClassLoader)这个加载器负责加载JAVA_HOME/lib/ext目录中的,

2021-09-14 18:19:10 81

原创 JVM之父类子类初始化过程以及类加载过程

父类子类初始化过程父类中有无参构造函数,子类构造函数默认调用super(),子类构造函数中可以不写super();若父类中只有有参构造函数,子类中必须在第一行调用super(参数); 如果没有任何构造函数,系统会默认有一个无参构造函数。初始化过程:1.初始化父类中的静态成员变量和静态代码块 (先声明的先执行);2.初始化子类中的静态成员变量和静态代码块(先声明的先执行);3.初始化父类的普通成员变量和构造代码块(先声明的先执行) ,再执行父类的构造方法;4.初始化子类的普通成员变量和构造代码块(

2021-09-14 17:05:20 698

原创 equals和==以及Java中数据类型的存放

equalsEquals与 == 的区别:= =是比较值,equals是比较内容。Equals是object类的一个方法,源码中是比较两者地址是否相同(用==号),string类等重写了这个方法(还要重写hashcode()),如果地址相同直接返回true,如果地址不同,每一位比较char是否相同equals()和hashCode()方法是用来在同一类中做比较用的,尤其是在容器里如set存放同一类对象时用来判断放入的对象是否重复。equals()相等的两个对象,hashcode()一定相等,equ

2021-09-14 17:03:08 98

原创 Process and Thread——进程与线程深度解析

进程与线程(1)一个程序至少有一个进程,一个进程至少有一个线程。(2)线程(Thread)是进程的一个实体,是CPU调度和分派的基本单位,是进程中负责程序执行的执行单元,也称为执行路径。进程是系统资源分配的基本单位。(3)进程拥有独立的地址空间,而多个线程共享内存。从而线程效率更高;(4)线程是轻量化的进程,是程序执行流的最小单位;由线程ID、程序计数器、寄存器集合(cpu只有一组寄存器,这里每个线程拥有自己的寄存器是说切换到自己的时候就把堆栈中保存的之前的值又放到寄存器中,切换时保存, 切回来时恢

2021-09-14 15:44:56 295

原创 Sort Algorithm--几种排序算法的解析、比较与实现

注意:快排的空间复杂度是O(logn),归并的额外空间复杂度是O(n),上面写错了。选择排序:从n个数中选出最小的,放在最前面,再从n-1选出最小的放在第二个。。。快排:最好的情况是枢纽元选取得当,每次都能均匀的划分序列。 时间复杂度O(nlogn)最坏情况是枢纽元为最大或者最小数字,那么所有数都划分到一个序列去了时间复杂度为O(n^2)。空间复杂度是递归swap交换两个数,如果使用异或,不能自己跟自己交换,因为自己异或自己得0,需要提前判断。插入排序的时间复杂度分析。在最坏情况下,数组完全逆序.

2021-09-14 15:34:46 128

原创 java.lang.ThreadLocal<T>深度解析

对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。ThreadLocal 并不能替代同步机制,两者面向的问题领域不同。1:同步机制是为了同步多个线程对相同资源的并发访问,是为了多个线程之间进行通信的有效方式;2:而threadLocal是隔离多个线程的数据共享,从根本上就不在多个线程之间共享变量,这样当然不需要对多个线程进行同步了

2021-09-11 16:16:14 319

原创 JVM——Java虚拟机深度解析(三)GC算法

垃圾收集算法1、标记-清除算法(Mark-Sweep)。首先标记处所有需要回收的对象,在标记完成后统一回收。缺点:标记和清除两个过程都效率低;标记清除后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行中需要分配大对象时,无法找到足够的连续内存而不得不提取触发GC。2、复制算法。将可用内存按容量划分成大小相等的两块,每次只使用一块。当这一块使用完了,就将还存活着的对象复制到另一块上面,然后再把已使用过的内存一次清理掉。这样不用考虑内存碎片的问题,只要移动堆顶指针,按顺序分配即可,实现简单、

2021-09-10 21:58:57 471

原创 JVM——Java虚拟机深度解析(二)

栈帧栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区的虚拟机栈的栈元素。栈帧存储了方法的局部变量表,操作数栈,动态连接和方法返回地址等信息。第一个方法从调用开始到执行完成,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。在编译代码的时候,栈帧中需要多大的局部变量表,多深的操作数栈都已经完全确定了,并且写入到了方法表的Code属性中,因此一个栈帧需要分配多少内存,不会受到程序运行期变量数据的影响,而仅仅取决于具体虚拟机的实现。一个线程中的方法调用链可能会很长,很多方法都同时处理

2021-09-10 21:09:30 123

原创 JVM——Java虚拟机深度解析(一)

Java虚拟机运行时内存1、程序计数器(Program Counter Register)程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的信号指示器。字节码解释器就是通过改变该计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需依赖计数器来完成。线程私有的此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。2、Java虚拟机栈(Java Virtual Machine Stack)J

2021-09-07 21:53:10 85

原创 Autoboxing and Unboxing——详解Java的自动装箱与拆箱

Integer的存储Integer是int的封装类,一般来说基础变量(int)赋值给Integer对象将自动装箱(Auto Boxing)并为Integer对象分配堆空间。因此即使基础变量值一样,封装类对象指向不同地址。对JVM为了节省空间, 当Integer的值落在-128~127之间时,如Integer i1 = 2; Integer i2 = 2;此时JVM首先检查是否已存在值为2的Integer对象。如果是,则i2直接是引用已存在对象,即i2 = i1。事实上, Integer已经默认创建了数

2021-09-07 19:08:32 110

原创 JMM(Java Memory Model)深度解析

由于计算机的存储设备与处理器的运算能力之间有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(cache)来作为内存与处理器之间的缓冲:将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存之中没这样处理器就无需等待缓慢的内存读写了。Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样底层细节。此处的变量与Java编程时所说的变量不一样,指包括了实例字段、静态字段和构成数组对

2021-09-07 11:50:38 91

原创 java.util.ArrayList及LinkedList的底层实现原理

常用集合类的继承结构如下:Collection<–List<–Vector 底层是数组Collection<–List<–Vector <–Stack(就是调用vector的方法,线程安全)Collection<–List<–ArrayList 底层是数组Collection<–List<–LinkedList 底层有node类存储了父节点和子节点Collection<–Set<–HashSet 底层是HashMap,只使用key

2021-09-07 10:56:59 160

原创 Singleton Pattern 两种模式

public class Singleton { private Singleton(){} private static final Singleton instance = new Singleton(); public static Singleton getInstance(){ return instance; }}这是一种饿汉且保证线程安全的模式(强烈推荐)。private static final Singleton instance = new Singleton();

2021-09-07 10:52:36 62

原创 java.util.concurrent.ConcurrentHashMap深度解析

java.util.concurrent.ConcurrentHashMap<K,V> JDK1.8本文的分析的源码是JDK8的版本,与JDK6的版本有很大的差异。实现线程安全的思想也已经完全变了,它摒弃了Segment(锁段)的概念,而是启用了一种全新的方式实现,利用CAS算法。它沿用了与它同时期的HashMap版本的思想,底层依然由“数组”+链表+红黑树的方式思想,大于8个转换为红黑树。默认初始大小16,负载因子也是0.75,定位元素的方法也是先hashCode(),再无符号右移16位异或

2021-09-06 21:40:08 949

原创 Java.Util——其余重要结构底层实现(一)

**HashSet/TreeSet**HashSet内部有一个HashMap,只使用了map的key,value都是同一个objectprivate static final Object PRESENT = new Object();TreeSet内部是一个TreeMap,只使用了key,value也是上面这个objectLinkedHashMapLinkedHashMap是HashMap的子类,与HashMap有着同样的存储结构,但它加入了一个双向链表的头结点(有head和tail指针),

2021-09-06 21:36:50 103

原创 Java.util——HashMap底层实现原理

Java.util——HashMap底层实现原理首先介绍一下一般常见的处理哈希冲突的几种方式:开放定址法(发生冲突,继续寻找下一块未被占用的存储地址),再散列函数法,链地址法,而HashMap即是采用了链地址法,也就是数组+链表的方式。HashMap的主干是一个Entry数组。Entry是HashMap的基本组成单元,每一个Entry包含一个key-value键值对。除了Entry外,HashMap还包括以下几个重要字段://实际存储的key-value键值对的个数transient int si

2021-09-02 21:44:54 382

原创 JAVA控制线程执行顺序的方法(三)

使用Locksupport中的park()、unpark()方法。示例如下:import java.util.concurrent.locks.LockSupport;public class ControlOrder3 { public static void main(String[] args) throws InterruptedException { Thread t1=new Thread(){ @Override p

2021-05-07 16:06:26 58

原创 JAVA控制线程执行顺序的方法(二)

使用ReentrantLock中的lock(),unlock()配合Condition的await(),signal()方法。示例如下:import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;public class ControlOrder2 { static ReentrantLock lock=new ReentrantLock(); static b

2021-05-07 11:28:48 48

原创 JAVA控制线程执行顺序的方法(一)

使用wait(),notify()方法:public class ControlOrder { static Object lock=new Object(); static boolean ist2Runned ; public static void main(String[] args) { Thread t1 = new Thread() { @Override public void run() {

2021-05-07 11:03:08 73

原创 多线程之生产者消费者模式的JAVA实现

话不多说,直接上代码。public class ProductConsume { public static void main(String[] args) { MessageQueue queue=new MessageQueue(2); for (int i=0;i<3;i++){ int id=i; new Thread("生产者"+i){ @Override

2021-05-07 08:38:32 43

原创 用Java多线程模拟两个人协作泡茶的过程

要泡好一壶茶需要许多流程,比如洗水壶,洗茶壶,洗茶杯,拿茶叶,烧开水等过程,如果依次进行这些操作,会造成许多不必要的耗时。因此需要同时进行一些操作,我们可以用java多线程来模拟。代码示例如下:public class DrinkTea { public static void main(String[] args) { Thread t1=new Thread("老王"){ @Override public void run() {

2021-05-03 11:26:59 313

原创 Java中的守护线程

Java中有种线程会随着主线程的结束而结束,无论该线程中的代码是否执行完成,比如垃圾回收器线程。用setDaemon方法设置其为守护线程。示例如下:public class DeamonThread { public static void main(String[] args) throws InterruptedException { Thread t=new Thread(){ @Override public void run

2021-05-02 17:39:15 166

原创 Java多线程的三种创建方法

Java多线程的三种创建方法1.直接new Thread,实现run()方法,然后用thread.start()开启。`public class MutiThread { public static void main(String[] args) { Thread thread=new Thread(){ @Override public void run() { System.out.printl

2021-05-01 21:08:05 122

转载 PYTHON获取当天日期进行格式转换

PYTHON获取当天日期进行格式转换import timedef getToday(format=3):“”“返回今天的日期字串”""# format=1 20190305# format=2 08:26# format=3 2019/03/05# format=4 2019/03/05 08:26# format=5 190305# format=6 2019-03-05# format=7 2019/03/05 0

2021-01-05 17:14:48 227

原创 Python基础之定义一个顺序表

Python基础之定义一个顺序表这是我第一次写,也是在边学边练的过程中,写的可能会有些问题,欢迎大家批评指正。class sqlist:def init(self,max=100): #初始化,默认分配给顺序表的空间为100个字符self.max=maxself.length=0self.data=[None]*maxdef is_empty(self): #判断是否为空 if self.length==0: return

2020-10-21 16:15:37 844 1

空空如也

空空如也

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

TA关注的人

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