自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

最自由的笑的博客

让优秀成为一种习惯

  • 博客(193)
  • 收藏
  • 关注

原创 ReentrantLock原理

ReentrantLock与synchronized对比synchronized是Java关键字,是jvm层面实现的锁,而ReentrantLock是一个Java类,基于aqs来实现,本质上是通过cas自旋+park实现锁机制,更容易在应用层面去扩展。可打断:对于synchronized来说,如果一个线程无法获得锁阻塞后,它只能一直等待,其他线程无法打断它。而对于ReentrantLock它支持可打断,一个线程无法获得锁阻塞后 可以被其他线程打断继续执行。(因为park的线程是可以被打断的,blo

2021-08-17 13:06:17 359

原创 synchronized原理

Java对象头Java对象由对象头和对象成员组成,存储时为了实现一些额外的功能 设置了对象头。普通对象 对象头|--------------------------------------------------------------|| Object Header (64 bits) ||------------------------------------|-------------------------||

2021-08-15 11:22:18 118

原创 java多线程基础

Java内存模型Java内存模型与Java内存结构不同,Java内存结构指的是jvm内存分区。Java内存模型描述的是多线程环境下原子性,可见性,有序性的规则和保障。Java内存模型提供了主内存和工作内存两种抽象,主内存指的是共享区域 ,工作内存指的是线程私有工作空间。当一个线程访问共享数据时,需要先将共享数据复制一份副本到线程的工作内存(类比操作系统中的高速缓存),然后在工作内存进行操作,最后再把工作内存数据覆盖到主内存。主内存和工作内存交互通过特定指令完成。如下为并发内存模型图

2021-08-08 23:32:58 374 1

原创 jvm常见字节码指令

一个class文件的完整格式使用javap命令可以将一个二进制的字节码文件反编译为人类容易阅读的形式。分析class文件最关键弄清楚常量池每个常量含义和方法中每个指令含义。对于如下java代码,使用javac我们将其编译为class文件public class Test { public static void main(String[] args) { System.out.println("hello"); }}然后使用命令 javap -v Test.

2021-08-08 15:37:25 488

原创 类加载机制深入

Tomcat-正统的类加载器架构对于一个web服务器如tomcat 需要实现如下功能:1 不同web应用所使用的类库需要相互隔离,不能互相影响,比如webapp1使用spring3.1依赖库,webapp2使用了spring3.2的依赖库,那么这两个应用依赖类库必须隔离。2 不同web应用所使用的基础类库可以共享,比如两个webapp都要使用java.lang的类库,那么需要进行共享,如果每个web应用都加载一份基础类库太浪费内存空间。3 web应用程序的类库不能影响到tomcat本

2021-08-06 13:35:43 214

原创 Java内存结构

jdk和jre以及jvm的关系jvm:Java虚拟机jre:Java运行环境,包含jvm与基础类库jdk:Java开发环境,包含jvm,基础类库以及编译工具。谈谈Java内存模型堆内存:保存对象实例,每个jvm进程对应一个堆内存,在jvm启动时创建,线程共享。随着逃逸分析技术的发展,部分原本在堆中分配内存的对象也可能在栈中分配。堆中的对象会由垃圾收集器进行回收。根据虚拟机规范的描述,Java堆可以分配在物理不连续的内存空间。虚拟机栈:为方法的运行提供内存空间,每个线程都会有一个私

2021-08-04 17:03:34 108

原创 Java网络编程

UDP代码示例UDP服务端程序,持续运行,接收UDP请求。public class UDPServer { public static void main(String[] args) throws IOException { DatagramSocket ds = new DatagramSocket(12345); //创建接收端socket对象并指定端口 //创建一个数据包对象用于接收数据 一次接收最大容量为1024 byte byte[

2021-08-04 16:51:58 64

原创 Java反射机制

认识class类class类是Java中所有类的一个映射,在反射中通过java.lang.Class这个类来对所有类进行操作。一般如果我们使用一个学生类student,我们要先对该类使用new进行实例化,但是有了class类后,我们可以通过class类来使用student类的成员变量和方法。这就是反射的思想。与class类类似还有Constructor 类是对所有构造方法的映射,Method 类是对所有成员方法的映射,Field 类是对所有成员变量的映射。反射概述反射机制是指在运行时去获取

2021-08-04 16:46:29 97

原创 hashmap原理解析

==和equals的区别== 用于判断两个对象引用的内存地址是否相等,如果用在基本类型判断两个值是否相等。equals 如果没有重写,默认比较的还是内存地址,可以通过重写实现比较两个对象的内容。equals()的重写规则自反性 x.equals(x)应返回true对称性 当且仅当:y.equals(x)返回true时,x.equals(y)才返回true。传递性 如果y.equals(x)返回true,y.equals(z)返回true,那么x.equals(z)也应返回tr

2021-08-03 17:59:29 208

原创 基于Java实现五子棋程序

五子棋程序实现起来逻辑不复杂,五子棋的规则也比较简单,只要5个相同颜色棋子连成一条线就说明玩家获胜。因此实现五子棋程序主要有两个问题去解决。1 五子棋的界面如何实现。2 给出一个棋盘如何判断有玩家获胜了。五子棋界面实现对于五子棋的界面,自己实现了两个版本。一个是字符界面版,只需要通过二维数组模拟棋盘打印即可,比较麻烦的是需要手动输入棋子的坐标。除此之外可以使用Java的swing库来实现GUI界面版本的五子棋程序,利用swing中的网格布局,使用button按钮代表棋子,并且为每个棋.

2021-08-03 17:12:42 1281

原创 基于javascript实现的网址收藏夹项目

我们在使用浏览器上网时,经常有很多网址需要记录,而浏览器自带了网址收藏夹功能单一使用起来很不方便。于是自己突发奇想基于原生javascript自己实现了一个网址收藏夹来方便自己使用,也经过了长时间的功能迭代。虽然自己最后没有从事前端开发的岗位,但是这个项目还是很大程度上培养了自己编程的兴趣,因此在这里分享以下以前做的这个项目。这个项目可以分门别类记录自己经常使用的网址,比如学习 娱乐 购物等等。而且支持自定义分类标签。可以手动编辑每一个网址信息可以很方便通过各个搜索引擎搜索内容基于.

2021-08-03 16:34:00 282

原创 python爬虫福布斯排行榜数据并可视化

使用python requests库爬取福布斯排行榜数据存放到本地excel文件,并通过matplotlab将数据进行分析和可视化原网页如下所示 https://www.phb123.com/renwu/fuhao/shishi_1.html保存的excel数据如下所示福布斯前十排行的数据可视化效果各个国家上榜人数所占比例的统计与可视化爬取网页数据解析为一个list集合的代码## 读取一页的数据def loaddata(url): from bs4 import Beaut.

2020-08-25 18:59:40 7271 8

原创 Java爬虫新浪微博的帖子

需求分析最近新型肺炎肆虐寒假在家闲来无事就突发奇想,爬取新浪微博中与肺炎患者自救有关的帖子以texcel形式保存起来做一些分析。经过一番折腾,最终使用webMagic框架成功爬取了200个微博页面共3263条帖子。立图为证环境搭建首先创建一个空的maven工程。在pom.xml文件引入相关依赖<dependencies><!-- 读写ex...

2020-02-02 18:26:44 1660 3

原创 Java的五种引用

寄存器寄存器是最快的存储区,其数据分配由编译器指定,对程序员不可见。静态存储空间静态存储里存放程序运行时一直存在的数据。即用static标识的静态变量。静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.栈内存存放基本类型的变量,以及引用类型的地址。即实例化一个对象时,对象名(引用对象的地址)存放在栈中,而这个对象本身存...

2019-04-08 16:15:07 694 1

原创 jvm垃圾回收算法

ls -al 列出所有文件的详细权限与属性[zuiziyoudexiao@localhost myproject]$ lsc语言课后练习 Java myhomepage Python[zuiziyoudexiao@localhost myproject]$ ls -al总用量 4drwxrwxr-x. 6 zuiziyoudexiao zuiziyoudexiao ...

2018-03-20 16:27:11 226

原创 mapreduce流程

mapreduce的整体流程输入:输入文件会被切分成多个切片,每一个切片交给一个map task进程来读取,默认每个block对应一个切片。默认的Textinputformat以行为单位进行读取,每行数据返回一个键值对,将行号为key,行文本作为value,交给map函数处理。因为如果一个切片包含了多个block,会存在maptask读取数据跨网络传输,不利于数据本地化的实现。map:在每个maptask中,有一个map函数,基于每行数据得到的键值对进行处理,得到新的键值对,

2021-08-17 18:16:55 335

原创 线程死锁问题

多把锁为了提高并发度我们可以提供多把锁,假设有一个共享资源room对象,很多线程会去访问,一部分线程只访问其中a资源,另一部分线程只访问b的资源,此时如果所有线程把锁加在room对象上面虽然可以保证线程安全,但是并发度不高。class Room{ Object a= new Object(); Object b= new Object();}此时可以使用两把锁,不要把锁加在room对象,而是分别加在a和b对象,这样第一类线程只需要申请a的锁,第二类线程只需要申请b的锁,锁的粒

2021-08-17 12:53:42 324

原创 wait与notify

为什么需要wait方法一个线程调用sleep方法会陷入休眠状态,虽然释放了cpu但是不会释放锁,这样就会造成浪费,因为陷入sleep状态的线程白白占着共享资源而没有使用它,使得其他线程不得不陷入等待状态。而wait方法虽然也会使线程陷入暂停状态,与sleep不同的是它会将cpu和锁资源全部释放。如下 线程1占用锁后休眠了100秒,在线程1休眠期间,线程2无法获得锁,因此无法往下执行,这样白白浪费了cpu资源。new Thread(() -> { synchronized (Code

2021-08-15 11:34:14 169

原创 线程类的常见方法

介绍线程类常用方法start方法: 让一个线程进入就绪状态run方法:线程真正要执行的逻辑,让一个线程分配的cpu资源,开始启动就会调用run方法执行sleep(n)方法:让线程休眠n毫秒,休眠时会让出cpu但不会释放锁。join方法:当前线程等待目标线程运行结束,再开始运行。可以设置超时时间interrupt()方法:打断线程,如果打断正在sleep,wait,join的方法会抛出InterruptedException异常,并清除打断标记。如果打断正在执行的线程,会设置打

2021-08-09 23:27:17 1091

原创 线程的状态转换

线程的五种状态(操作系统层面)初始状态:创建线程,分配资源,但还没有调度到就绪队列。就绪状态:线程已经被创建,等待获取cpu调度执行。运行状态:正在使用cpu执行的状态,当时间片用完,会由运行态变为就绪态。阻塞状态:线程暂时丢失cpu使用权的状态,比如发生io操作 等待锁。终止状态:线程已经执行完毕。线程的六种状态(java层面)新建状态 NEW,线程创建之后还没有调用start方法就是这种状态。运行状态 RUNNABLE:它包含了操作系统层面的就绪 运行 以及io阻塞状态,在Jav

2021-08-09 23:23:10 254

原创 线程的创建方式

谈谈线程创建有哪些方式1 继承Thread类重写run方法,然后调用自定义实例的start方法。2 实现Runable接口重写run方法,将Runable实例封装为Thread实例并调用start方法。3 实现Callable接口重写call方法,将Callable实例封装为FutureTask对象,进而封装为Thread对象并调用start方法。可以通过FutureTask对象get方法获取线程返回值。4 使用线程池方法1有单继承的局限性,自定义类继承了Thread不能继承其他类了。方法2解

2021-08-09 23:19:45 104

原创 类加载机制

class文件的格式魔数:class文件的前4字节为魔数,用于确定当前文件是否能够被虚拟机识别。版本号:魔数后面4字节用于描述class文件的版本号。高版本jvm可以兼容低版本class文件,反之不可以。常量池:版本号之后紧随数据是常量池,常量池主要存放字面量(字符串,final数字)和符号引用(类名 方法名)。符号引用会在类加载时通过动态链接与具体内存地址相对应。类的访问标志:用于标明一个类是否是public,是否是abstract,是否是接口等。类索引,父类索引,接口索引:用于描述类的继承关

2021-08-06 13:19:44 215

原创 jvm调优工具

jvm常用参数与命令常用jvm参数-Xms20M 设置初始 Java 堆大小-Xmx20M 设置最大 Java 堆大小-XX:MaxDirectMemorySize=20M 设置堆外内存大小-XX:MetaspaceSize=20m 设置初始元空间大小-XX:MaxMetaspaceSize=20m 设置最大元空间大小jps命令jps 查看所有jvm进程 (进程id 主类名)jps -l 显示全类名jps -v 显示j

2021-08-06 13:07:28 298

原创 map算子源码分析

map算子源码解析map算子可以对rdd中的元素进行一对一的映射。如下表示将rdd每个元素乘以2,并且map之后新的rdd分区数不会改变。val rdd1 = sc.parallelize(List(1,2,3,4,5))rdd1.map(a=>a*2).collect().foreach(println(_))现在分析一下map算子的底层实现def map[U: ClassTag](f: T => U): RDD[U] = withScope { val cleanF

2021-03-07 14:23:53 222

原创 rdd创建源码分析

parallelize方法源码分析parallelize用于通过本地集合创建rddval rdd1 = sc.parallelize(List(1,2,3,4,5,6))现在研究一下,这个方法底层都做了什么事情通过ctrl+b点进入,底层方法如下,可以发现它设置了一个默认参数numslices=defaultParallelism表示分区数量,以及新建了一个ParallelCollectionRDD实例对象。def parallelize[T: ClassTag]( seq:

2021-03-07 14:20:59 330

原创 spark提交job源码分析

collect()算子源码分析对于任何行动算子都会触发sparkjob的提交,查看collect()算子源码*sc.runJob(this, (iter: Iterator[T]) => iter.toArray) //传入了一个函数f,它将每个分区迭代器转换为数组 *runJob(rdd, func, 0 until rdd.partitions.length) //多传入了一个0---分区长度的range集合 *val cleanedFunc = clean(func)

2021-03-07 14:08:37 121

原创 springboot基本使用笔记

springboot是什么springboot其实没什么新东西,他只是简化了我们的配置,帮助我们更方便集成ssm。所以说知识上面没什么改变,等一切都配置集成好了,用的还是ssm那些东西在干活。快速搭建一个SpringBoot 应用在idea中选择创建一个spring initializr工程在模块中可以选择需要的模块,比如springweb,mysql,springdata等。最后idea就会帮我们生成一个项目,可以在resources目录编写配置文件,可以在static目录存放

2020-09-10 17:00:45 104 1

原创 springMVC笔记

springMVC的工作流程Spring MVC 框架主要由 前端控制器、处理器映射器、控制器、视图解析器、视图组成客户端发送http请求,首先提交到前端控制器。前端控制器根据处理器映射器,找到请求对应的控制器,将请求交给对应的控制器。控制器完成具体的业务逻辑后,会返回ModelAndView。然后前端控制器根据视图解析器,找到 对应的视图进行渲染。最终把结果返回给前端。http请求—前端控制器—请求到处理器映射器—控制器control—返回modelandview—前端控制器—视图解析器—

2020-09-10 16:53:59 85

原创 spring AOP机制

AOP思想AOP面向切面编程思想是对 OOP面向对象思想的一种补充,OOP思想通过封装、继承和多态性等概念来建立一种对象层次结构。但是当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。比如日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。这种散布在各处的无关的代码被称为横切代码,在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。而AOP技术则恰恰相反,它可以解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“A

2020-09-10 16:50:17 142

原创 spring ioc

为什么会出现ioc我们开发一个Java程序,本质上就是各个Java实例对象之间相互配合,相互协作,彼此依赖,支撑着整个Java程序的良好运行。而在这样的程序中,对象之间的耦合关系是无法避免的,也是必要的,这是协同工作的基础。但是随着应用程序规模越来越庞大,对象之间的依赖关系也越来越复杂,经常会出现对象之间的多重依赖性关系,因此,对于系统的分析和设计,将面临更大的挑战。对象之间耦合度过高的系统,必然会出现牵一发而动全身的情形。为了解决这个问题,ioc控制反转思想应运而生。IOC思想Ioc意味

2020-09-10 16:48:13 85

原创 spring概述

spring的特点IOC:控制反转AOP:面向切面编程。ApplicationContext对象可以理解为ApplicationContext对象就是一个spring容器,它包含了所依赖的所有的Javabean对象。它的功能有管理,装配bean,加载资源文件,实现监听等。一般通过读全局配置文件创建ApplicationContext对象ApplicationContext ac = new ClassPathXmlApplicationContext("applicationConte

2020-09-10 16:44:28 57

原创 tocken机制

cookie-session机制的缺点如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候session会丢失,因为session默认存放在一个服务器内存中。每次认证用户发起请求时,服务器需要去创建一个记录来存储信息。过多的Session存储在服务器内存中,会对服务器造成压力。如果浏览器不支持cookie,cookie-session机制便无法使用。cookie存在跨域的限制。tocken机制流程当用户登录成功之后, 服务器端就会通过指定算法生成一个 token,过期时间

2020-09-10 16:42:05 1279

原创 cookie与session对象

cookie对象常用方法获取cookie对象Cookie[] cookies = request.getCookies();获取cookie中的信息Cookie[] cookies = req.getCookies();if(cookies != null){ for(Cookie cookie : cookies){ System.out.println(cookie.getName()+":"+cookie.getValue()); }}向

2020-09-10 16:40:18 260

原创 ServletContext 对象

ServletContext 对象获取方式ServletContext 表示整个web应用的上下文对象,所有用户共享。通过request对象获取ServletContext context1 = req.getServletContext();通过HttpServlet对象获取ServletContext context2 = this.getServletContext();ServletContext常用方法获取一个文件名对应MIME类型ServletContext

2020-09-10 16:36:12 101

原创 request与response对象

request获取请求行数据获取请求方式System.out.println(req.getMethod());获取虚拟目录System.out.println(req.getContextPath());获取servlet路径System.out.println(req.getServletPath());获取get方式的请求参数System.out.println(req.getQueryString());获取请求urlSystem.out.println(re

2020-09-10 16:33:34 391

原创 servlet笔记

servlet的执行流程首先用户提交一个http请求。tomcat会解析请求的url路径获取访问的servlet资源路径如果通过请求url能够找到与之对应的servlet,那么tomcat会创建一个servlet实例,调用其中的方法执行。同时tomcat容器解析请求,封装成HttpServletRequest类型的request对象。将要响应的信息封装为HttpServletResponse类型的response对象。在servlet的对应方法中可以通过API对request对象和respons

2020-09-10 16:29:35 306

原创 Linux文件压缩与打包

常见的压缩文件扩展名有:*.Z compress 程序压缩的档案;*.gz gzip 程序压缩的档案;*.bz2 bzip2 程序压缩的档案;*.tar tar 程序打包的数据,并没有压缩过;*.tar.gz tar 程序打包的档案,其中并且经过 gzip 的压缩*.tar.bz2 tar 程序打包的档案,其中并且经过 bzip2 的压缩常见压缩指令:compress compress 已经退流行了,基本已经淘汰gzi

2020-08-27 17:31:25 98

原创 Linux目录与文件命令

目录相关指令切换目录cd .. //返回上一级目录cd - //返回前一个目录cd ~ //切换到当前用户家目录cd 完整目录名 //切换到指定目录查看当前目录pwd //显示当前工作路径查看一个目录的文件ls //显示当前目录的文件ls /home //列出home目录下的文件ls -a //显示当前目录文件(包括隐藏文件)ls -l //显示当前目录的文件以及详细属性ls -h //将文件大小以易

2020-08-27 16:56:39 104

原创 hive窗口函数

概述窗口函数与分组聚合函数类似,都是针对一个分组进行处理,不同的是分组聚合是每个分组数据生成一个结果,而窗口函数是每个分组中每一行生成一个结果。首先准备测试数据jack 开发 18tom 开发 25shy 销售 63duke 开发 21zoom 销售 90penut 销售 22leyan 销售 65jkl 开发 35ning 开发 75faker 销售 27wwk 销售 33letme 开发 24mlxg 开发 77pdd 开发 75369 开发 33创建stu表

2020-06-26 11:45:08 274

原创 hive长表转宽表

需求分析本地原始数据name message valuetom age 18tom sex 男tom address 西安jack age 25jack sex 女jack address 重庆转换后数据name age sex addresstom 18 男 西安jack 25 女 重庆实现思路创建stu表 导入数据create table stu( name string, message string, value string )

2020-06-26 11:39:44 2398

空空如也

空空如也

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

TA关注的人

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