
Java基础知识
ITJingYing2050
这个作者很懒,什么都没留下…
展开
-
面向Socket编程,实现Java客户端向服务器发送http请求
文章目录前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言作为一个合格的程序员,不能不懂网络编程,说到网络编程,Socket编程作为网络通信的底层API,对我们了解那些网络框架的原理,大有助益。一、pandas是什么?二、使用步骤总结...原创 2020-09-22 10:24:38 · 1191 阅读 · 0 评论 -
使用Mac 终端发送http请求
1.curl www.baidu.com在终端输入上面指令可以获取到百度服务器传过来的html,上面默认请求方式是get。如图:2.curl -v www.baidu.com可以看到详细请求和响应过程:3.curl --data "参数名=值" url这是post请求方式。...原创 2020-09-15 11:26:15 · 4430 阅读 · 0 评论 -
jvm调优的常见指令和参数
1.指令1.jps命令用于查询正在运行的JVM进程。2.jstat可以实时显示本地或者远程JVM进程中类的装载、内存、垃圾收集、JIT编译等数据。3.jinfo用于查询当前运行的JVM的属性和参数值。4.jmap用于显示当前Java堆和永久代的详细信息。5.jhat用于分析使用jmap生成的dump文件,是JDK自带的工具。6.jstack用于生成当前JVM所有线程的快照,线程快照是JVM每一个线程正在执行的方法,目的是定位出线程出现长时间停顿的原因。2.参数1.-Xmx:用原创 2020-07-03 16:56:37 · 763 阅读 · 0 评论 -
理解ClassLoader
Java虚拟机中的类加载子系统,它的主要作用就是通过多种类加载器(ClassLoader)来查找和加载Class文件到Java虚拟机中。ClassLoader的类型:(Java)包括系统类加载器和自定义加载器。系统类:Bootstrap ClassLoader,ExtensionsClassLoader和ApplicationClassLoader。Bootstrap ClassL...原创 2019-03-15 17:19:45 · 238 阅读 · 0 评论 -
详细的说说Java的垃圾回收机制
首先提起垃圾回收机制,我们需要考虑三个问题:1.那些内存可以回收这个问题涉及引用管理,那么,什么是引用呢?引用:如果reference类型的数据存储的数值代表的是另一块内存的起始地址,就称这块内存代表着一个引用。引用分为4种类型:1.强引用:如 String str = "abc",一般用“=”连接,这就是强引用,在程序代码中普遍存在,只要强引用还在,那么垃圾收 集器就永远不会回收被引用对象。2.软引用:提供SoftReference类来实现软引用,用来...原创 2020-06-30 11:39:08 · 438 阅读 · 0 评论 -
浅谈JVM的组成
JVM主要由4部分组成:1.类加载器(ClassLoader):在JVM启动时或者类运行时,将需要的class文件加载到JVM中。2.Java内存区:在JVM运行时操作系统分配的内存区。运行时内存区主要可以分为5个部分:方法区(MethodArea):用于存储类结构信息的地方,包括常量池、静态变量、构造函数等。虽然JVM规范把方法区描述为堆的一个辑部分,但是他还有一个别名non-heap(非堆)。方法区还包含一个运行时常量池。 Java堆(Heap):存放实例或对象的内存区域。 Java栈(原创 2020-06-18 16:59:50 · 391 阅读 · 0 评论 -
如何安全停止一个线程任务
1.终止线程:1.使用violate boolean变量退出标志,使线程正常退出,即线程执行完run方法体后,正常退出(推荐)。2.使用interrupt() 尝试终止线程,但是不一定成功。3.使用stop()强制终止线程。不安全的是:创建子线程的线程会抛出异常,并且会释放子线程持有的所有的锁。2.终止线程池1.shutdown()关闭线程池线程池不会立马关闭,要等添加到线程池的任务都执行完了,才会关闭。2.shutdownNow()关闭线程池并终止任务终止等待执行的线程,并原创 2020-06-17 16:45:30 · 742 阅读 · 0 评论 -
乐观锁和悲观锁
悲观锁:总是假设最坏的情况:每次去拿数据的时候,都认为值会被别人修改。因此给值加上锁,这样别的线程就不能访问了。如synchronized和ReentrantLock就是悲观锁。适用于多写情形。乐观锁:总是假设最好的情况:每次去拿数据的时候,都认为值不会被别人修改。因此不会给值加锁。但是在更新的时候,会去判断这个数据是否被更新过。可以使用版本号机制和CAS算法实现。乐观锁适用于多读情形,这样可以提高吞吐量。乐观锁的实现方式:1.版本号机制:一般在数据表加一个数据版本号(version原创 2020-06-16 17:28:49 · 263 阅读 · 0 评论 -
什么导致线程阻塞
线程阻塞的引入:为了解决共享存储区的访问冲突,Java引入了同步机制。显然光有同步机制是不够的,因为任意时刻所需的资源不一定准备好了,反过来,同一时刻准备好的资源也可能不止一个。为了应对这种情况,Java又引入了阻塞机制。阻塞是指暂停某一线程的执行直到满足某一条件,才继续执行。Java提供大量方法来支持阻塞,下面来逐一介绍。sleep():它使线程进入阻塞状态,失去CPU执行时间。指定时间一过,线程重新进入可执行状态。suspend()和resume():它们需要配套使用,suspend原创 2020-06-15 13:34:06 · 1479 阅读 · 0 评论 -
线程死锁的四个条件
1.死锁是如何发生的?当线程A独占锁a,尝试获取锁b,而线程B独占锁b,尝试获取锁a时,因为线程AB互相持有对方想要的锁,而陷入死锁。2.造成死锁的四个条件1.互斥:某种资源一次只允许一个进程访问,即该资源一旦分配给了某个进程,其他进程就无法访问了。直至该进程访问结束。2.占有且等待:一个进程本身占有资源,还有资源没有得到满足,在等待其他进程释放该资源。3.不可抢占资源:别人已经占有了某项资源,不能因为自己需要,就去抢占资源。4.循环等待:存在一个进程链,使得每个进程都占有下一个进程原创 2020-06-11 16:59:44 · 1062 阅读 · 0 评论 -
Java多并发的相关知识点
1.多线程的使用场景:使用多线程效率就一定高吗?有时候使用多线程不是为了效率高,而是为了可以同时干几件事。1.为了不阻塞主线程,使用其他线程来做事。如APP的耗时操作就不在UI主线程里面做。2.实现更快的应用程序,即主线程监听用户的请求,子线程去处理用户请求,以获得大的吞吐量。如:JavaWeb主线程监听用户请求,子线程处理用户请求。3.某种虽然优先级很低的服务,但是却要不定时去做。比如JVM的垃圾回收。4.某种操作虽然耗时,但是不消耗CPU执行时间。开个线程执行效率会提高很多。比如:读原创 2020-06-10 15:48:38 · 227 阅读 · 0 评论 -
ReentrantLock的原理
1.ReentrantLock的简单介绍:ReentrantLock是Java并发包中提供的一个可重入的互斥锁。ReentrantLock和Synchronized在基本用法,行为语义上都是类似的。同样都具有可重入性。但是ReentrantLock可以实现公平锁。2.ReentrantLock具有可重入性,公平锁,非公平锁。可重入性:所谓可重入性,就是可以支持一个线程重复获取锁。公平锁:是指获取锁的策略相对公平,当多个线程获取同一把锁时,必须按照申请锁的时间排好序依次获取锁,不能插队。非原创 2020-06-09 17:02:48 · 278 阅读 · 0 评论 -
volatile的原理
遇到可见性,有序性,原子性的问题时,我们通常可以使用synchronized关键字来解决。但是我们都知道synchronized是较重量级操作。这时我们可以使用volatile关键字来解决可见性,有序性问题。对于原子性,volatile只支持只读或者只写。如:i++,这种不行,这是又读又写。volatile也是互斥同步的一种实现,他是非常轻量级的。1.volatile的意义:volatile有两条关键语义:1.保证被volatile修饰的变量对所有线程都是可见的;如何保证可见性?被v原创 2020-06-05 16:51:21 · 180 阅读 · 0 评论 -
Synchronized 的原理
Synchronized代码块是由一对monitorenter(持有monitor对象)/monitorexit(释放monitor对象)指令实现的,monitor对象是同步的基本实现。而synchronized方法,JVM使用ACC_SYNCHRONIZED访问标志来判断是否是一个同步方法,从而执行相应的同步调用。Java6之前,monitor的实现是通过操作系统的互斥锁,因为需要进行用户态到内核态的切换,所以同步操作是一个没有差别的重量级操作。现代的(Oracle)JDK中,JVM对这种情况进行原创 2020-06-05 10:04:26 · 192 阅读 · 0 评论 -
谈谈对线程池的理解
1.什么是线程池?线程池就是事先将多个线程对象放入一个容器中,当需要使用时,不需要new 线程,直接去线程池拿线程就行了。2.为什么使用线程池?1.节省开辟子线程的时间,提高代码的执行效率。2.方便管控线程并发数。3.Java中一共有 4 种线程池:1.可缓存线程池,不固定线程个数: public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Int原创 2020-05-20 17:10:12 · 362 阅读 · 0 评论 -
简单谈谈对Java中反射的理解
1.什么是反射:Java的反射机制是在运行状态中,对于任意一个类,都能知道这个类的所有方法和属性,对于任意一个对象,都可以调用这个对象的任意方法和属性。这种动态获取信息和动态调用对象的方法和属性的功能称之为Java的反射机制。反射就是把Java类中各种成分映射成一个个对象。2.反射...原创 2020-05-14 11:34:52 · 398 阅读 · 0 评论 -
ArrayMap和sparseArray相较于HashMap的改进
当要存储大量数据时,hashMap需要不断扩容,需要不停的做hash运算,这样会极大的浪费内存空间,消耗性能。SparseArray:1.SparseArray比HashMap更加节省空间,在某些情况下,性能也比HashMap强。主要原因是其避免了key的自动装箱(int 转化为integer类型)。2.它内部用两个数组来存储数据,一个存储key,一个存储value。而且为了进一步优化空间,它内部采用压缩数据的方式来表示稀疏数组的数据(数组空间实际使用率低,很多都是空的,造成空间浪费)。3.原创 2020-05-12 10:33:53 · 403 阅读 · 0 评论 -
HashMap1.7和1.8原理解析
HashMap1.7原理:HashMap的底层实现是:数组 + 链表结构;负载因子:1.HashMap的初始化容量是16,负载因子是0.75,当元素个数达到 16*0.75 = 12 时,HashMap就会进行扩容。扩容就会进行reHash(为key重新计算存放位置),复制数据。非常消耗性能。2.通常如果可以指定HashMap的大小最好,可以减少扩容带来的性能消耗。其实真正存放...原创 2020-04-27 16:22:38 · 835 阅读 · 0 评论 -
Set如何从原理上保证不重复?
1.在往Set加入元素的时候,如果元素不存在,则添加成功。2.具体来说:在往HashSet添加元素时,首先要计算出该元素的hashcode的值,然后用(该元素的hashcode值)%(集合长度)+ 1得出这个元素的位置。如果这个位置为空,则添加进去。如果不为空,就通过equals()方法比较两者内容是否相同。如果相同,就不添加。反之找一个位置存放。...原创 2020-04-20 13:28:55 · 661 阅读 · 0 评论 -
集合list、set、map有哪些具体的实现类,区别是什么
Iterator是集合的总接口,其他的集合接口都继承于它,它定义了集合的遍历操作。collection继承了Iterator是次接口,原创 2020-04-20 11:32:55 · 1722 阅读 · 0 评论