JAVA
文章平均质量分 85
zuiziyoudexiao
真正的自由不是随心所欲,而是自我主宰,若求随心所欲,则必随波逐流。
展开
-
ReentrantLock原理
ReentrantLock与synchronized对比synchronized是Java关键字,是jvm层面实现的锁,而ReentrantLock是一个Java类,基于aqs来实现,本质上是通过cas自旋+park实现锁机制,更容易在应用层面去扩展。可打断:对于synchronized来说,如果一个线程无法获得锁阻塞后,它只能一直等待,其他线程无法打断它。而对于ReentrantLock它支持可打断,一个线程无法获得锁阻塞后 可以被其他线程打断继续执行。(因为park的线程是可以被打断的,blo原创 2021-08-17 13:06:17 · 418 阅读 · 0 评论 -
线程死锁问题
多把锁为了提高并发度我们可以提供多把锁,假设有一个共享资源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 · 380 阅读 · 0 评论 -
wait与notify
为什么需要wait方法一个线程调用sleep方法会陷入休眠状态,虽然释放了cpu但是不会释放锁,这样就会造成浪费,因为陷入sleep状态的线程白白占着共享资源而没有使用它,使得其他线程不得不陷入等待状态。而wait方法虽然也会使线程陷入暂停状态,与sleep不同的是它会将cpu和锁资源全部释放。如下 线程1占用锁后休眠了100秒,在线程1休眠期间,线程2无法获得锁,因此无法往下执行,这样白白浪费了cpu资源。new Thread(() -> { synchronized (Code原创 2021-08-15 11:34:14 · 198 阅读 · 0 评论 -
synchronized原理
Java对象头Java对象由对象头和对象成员组成,存储时为了实现一些额外的功能 设置了对象头。普通对象 对象头|--------------------------------------------------------------|| Object Header (64 bits) ||------------------------------------|-------------------------||原创 2021-08-15 11:22:18 · 220 阅读 · 0 评论 -
线程类的常见方法
介绍线程类常用方法start方法: 让一个线程进入就绪状态run方法:线程真正要执行的逻辑,让一个线程分配的cpu资源,开始启动就会调用run方法执行sleep(n)方法:让线程休眠n毫秒,休眠时会让出cpu但不会释放锁。join方法:当前线程等待目标线程运行结束,再开始运行。可以设置超时时间interrupt()方法:打断线程,如果打断正在sleep,wait,join的方法会抛出InterruptedException异常,并清除打断标记。如果打断正在执行的线程,会设置打原创 2021-08-09 23:27:17 · 1216 阅读 · 0 评论 -
线程的状态转换
线程的五种状态(操作系统层面)初始状态:创建线程,分配资源,但还没有调度到就绪队列。就绪状态:线程已经被创建,等待获取cpu调度执行。运行状态:正在使用cpu执行的状态,当时间片用完,会由运行态变为就绪态。阻塞状态:线程暂时丢失cpu使用权的状态,比如发生io操作 等待锁。终止状态:线程已经执行完毕。线程的六种状态(java层面)新建状态 NEW,线程创建之后还没有调用start方法就是这种状态。运行状态 RUNNABLE:它包含了操作系统层面的就绪 运行 以及io阻塞状态,在Jav原创 2021-08-09 23:23:10 · 299 阅读 · 0 评论 -
线程的创建方式
谈谈线程创建有哪些方式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 · 128 阅读 · 0 评论 -
java多线程基础
Java内存模型Java内存模型与Java内存结构不同,Java内存结构指的是jvm内存分区。Java内存模型描述的是多线程环境下原子性,可见性,有序性的规则和保障。Java内存模型提供了主内存和工作内存两种抽象,主内存指的是共享区域 ,工作内存指的是线程私有工作空间。当一个线程访问共享数据时,需要先将共享数据复制一份副本到线程的工作内存(类比操作系统中的高速缓存),然后在工作内存进行操作,最后再把工作内存数据覆盖到主内存。主内存和工作内存交互通过特定指令完成。如下为并发内存模型图原创 2021-08-08 23:32:58 · 403 阅读 · 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 · 520 阅读 · 0 评论 -
类加载机制深入
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 · 250 阅读 · 0 评论 -
类加载机制
class文件的格式魔数:class文件的前4字节为魔数,用于确定当前文件是否能够被虚拟机识别。版本号:魔数后面4字节用于描述class文件的版本号。高版本jvm可以兼容低版本class文件,反之不可以。常量池:版本号之后紧随数据是常量池,常量池主要存放字面量(字符串,final数字)和符号引用(类名 方法名)。符号引用会在类加载时通过动态链接与具体内存地址相对应。类的访问标志:用于标明一个类是否是public,是否是abstract,是否是接口等。类索引,父类索引,接口索引:用于描述类的继承关原创 2021-08-06 13:19:44 · 239 阅读 · 0 评论 -
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 · 328 阅读 · 0 评论 -
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 · 246 阅读 · 0 评论 -
Java内存结构
jdk和jre以及jvm的关系jvm:Java虚拟机jre:Java运行环境,包含jvm与基础类库jdk:Java开发环境,包含jvm,基础类库以及编译工具。谈谈Java内存模型堆内存:保存对象实例,每个jvm进程对应一个堆内存,在jvm启动时创建,线程共享。随着逃逸分析技术的发展,部分原本在堆中分配内存的对象也可能在栈中分配。堆中的对象会由垃圾收集器进行回收。根据虚拟机规范的描述,Java堆可以分配在物理不连续的内存空间。虚拟机栈:为方法的运行提供内存空间,每个线程都会有一个私原创 2021-08-04 17:03:34 · 142 阅读 · 0 评论 -
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 · 88 阅读 · 0 评论 -
Java反射机制
认识class类class类是Java中所有类的一个映射,在反射中通过java.lang.Class这个类来对所有类进行操作。一般如果我们使用一个学生类student,我们要先对该类使用new进行实例化,但是有了class类后,我们可以通过class类来使用student类的成员变量和方法。这就是反射的思想。与class类类似还有Constructor 类是对所有构造方法的映射,Method 类是对所有成员方法的映射,Field 类是对所有成员变量的映射。反射概述反射机制是指在运行时去获取原创 2021-08-04 16:46:29 · 134 阅读 · 0 评论 -
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 · 249 阅读 · 0 评论 -
Java爬虫新浪微博的帖子
需求分析最近新型肺炎肆虐寒假在家闲来无事就突发奇想,爬取新浪微博中与肺炎患者自救有关的帖子以texcel形式保存起来做一些分析。经过一番折腾,最终使用webMagic框架成功爬取了200个微博页面共3263条帖子。立图为证环境搭建首先创建一个空的maven工程。在pom.xml文件引入相关依赖<dependencies><!-- 读写ex...原创 2020-02-02 18:26:44 · 1760 阅读 · 3 评论 -
hashcode()和equals()在hashset中的应用---
xhr对象的属性与方法详解属性: -readyState: HTTP 请求的状态 -responseText: 响应体(不包括头部) -responseXML: 对请求的响应,解析为 XML 并作为 Document 对象返回。 -status: 由服务器返回的 HTTP 状态代码,如 200 表示成功 -statusText: HTTP状态字符串。当状态为200的时转载 2017-07-27 18:48:40 · 327 阅读 · 0 评论 -
Java引用与C语言指针区别
Java中的引用可以理解为被封装过的指针,与指针相比引用是可控的,所以更加安全。引用不可以计算而指针可以计算,C语言指针更加灵活,也容易产生内存泄漏问题。Java中的引用由于受到封装可以不用关心细节,而C语言的指针本质上就是一个int变量。Java引用类型的初始值是null,而C语言指针的初始值是未知的,不可控的。Java引用作为函数参数时,传递的是引用值的copy,在函数内部可以改变引...转载 2019-04-08 17:38:07 · 1936 阅读 · 0 评论 -
Java的五种引用
寄存器寄存器是最快的存储区,其数据分配由编译器指定,对程序员不可见。静态存储空间静态存储里存放程序运行时一直存在的数据。即用static标识的静态变量。静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.栈内存存放基本类型的变量,以及引用类型的地址。即实例化一个对象时,对象名(引用对象的地址)存放在栈中,而这个对象本身存...原创 2019-04-08 16:15:07 · 732 阅读 · 1 评论