
Java
文章平均质量分 79
JAVA SE、JAVA EE
crazy_xieyi
任何信手拈来的从容,都是厚积薄发的沉淀
展开
-
基于UDP/TCP实现客户端服务器的网络通信程序
UDP是无连接、不可靠传输、面向数据报、全双工;TCP是有连接、可靠传输、面向字节流、全双工。基于UDP实现客户端服务器的网络通信程序和基于TCP实现客户端服务器的网络通信程序。原创 2023-02-09 08:00:00 · 1220 阅读 · 9 评论 -
抽象类和接口有什么区别?
抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而 接口中不能包含普通方法, 子类必须重写所有的抽象方法。原创 2023-02-04 09:38:59 · 328 阅读 · 4 评论 -
线程安全的集合类(多线程环境下使用ArrayList、队列及哈希表)
1. 多线程环境下使用ArrayList2. 多线程环境下使用队列3. 多线程环境下使用哈希表:ConcurrentHashMap进行了哪些优化?比HashTable好在哪里?和HashTable之间的区别是啥?Hashtable和HashMap、ConcurrentHashMap 之间的区别?ConcurrentHashMap在jdk1.8做了哪些优化?ConcurrentHashMap的读是否要加锁?原创 2023-02-02 14:43:04 · 2243 阅读 · 23 评论 -
多线程之Callable接口、ReentrantLock、信号量 Semaphore以及CountDownLatch
一、Callable接口1.Callable的用法2.小结二、ReentrantLock1.ReentrantLock 的用法2.ReentrantLock 和 synchronized 的区别?3.为什么有了 synchronized 还需要 juc(java.util.concurrent) 下的 lock?三、信号量 Semaphore1.如何理解信号量?2.信号量可以用在过哪些场景下?3.线程同步的方式有哪些?四、CountDownLatch是同时等待 N 个任务执行结束原创 2023-01-31 08:12:51 · 1455 阅读 · 6 评论 -
多线程之CAS
CAS全称 Compare and swap, 即 "比较并交换"。相当于通过一个原子的操作, 同时完成 "读取内存, 比较是否相等, 修改内存" 这三个步骤,本质上需要 CPU 指令的支撑。解决CAS带来的问题需要给要修改的数据引入版本号。在 CAS 比较数据当前值和旧值的同时, 也要比较版本号是否符合预期。如果发现当前版本号和之前读到的版本号一致, 就真正执行修改操作, 并让版本号自增; 如果发现当前版本号比之前读到的版本号大, 就认为操作失败。原创 2023-01-29 09:59:10 · 2296 阅读 · 10 评论 -
synchronized 原理(锁升级、锁消除和锁粗化)
关于锁升级,根据锁竞争的情况,synchronized从无锁、偏向锁、轻量级锁和重量级锁升级。关于锁消除,编译器智能的判定,看当前的代码是否是真的要加锁,如果这个场景不需要加锁,程序猿也加了,那么就会自动把锁给干掉。关于锁粗化,通常情况下,认为锁的粒度细一点比较好。加锁的部分的代码,是不能并发执行的,锁的粒度越细,能并发的代码就越多;反之就越少。但是有些情况下,锁的粒度粗一些反而更好,两次加锁解锁之间,间隙非常小,此时,不如就直接一次大锁搞定得了。原创 2023-01-19 08:00:00 · 1548 阅读 · 14 评论 -
多线程之常见的锁策略
一、乐观锁 VS 悲观锁二、互斥锁 VS 读写锁三、轻量级锁 VS 重量级锁四、自旋锁 VS 挂起等待锁五、公平锁 VS 非公平锁六、可重入锁 VS 不可重入锁原创 2023-01-17 06:30:00 · 1169 阅读 · 19 评论 -
线程池(关于变量捕获、线程数、针对ThreadPoolExecutor的构造方法参数的解释、自实现线程池)
一:相比较于进程,创建线程 / 销毁线程 的开销是相对较小的,但是太过频繁的创建线程 / 销毁线程,其开销也很大。这时候我们就需要使用线程池来减少每次启动和销毁线程的损耗。事先把需要使用的线程先创建好,然后放到线程池中,后面需要使用的时候,直接从池里面获取,如果用完了就还给池。二、关于变量捕获三、针对ThreadPoolExecutor的构造方法参数的解释四、自实现线程池原创 2023-01-15 10:14:58 · 950 阅读 · 9 评论 -
实现定时器(基于标准库提供的定时器、基于优先级队列自实现的定时器)
一、基于标准库提供的定时器二、基于优先级队列自实现的定时器原创 2023-01-14 09:35:18 · 563 阅读 · 16 评论 -
生产者消费者模型(基于标准库提供的阻塞队列、基于环形数组自实现的阻塞队列)
一、基于标准库提供的阻塞队列实现生产者消费者模型二、基于环形数组自实现的阻塞队列实现生产者消费者模型原创 2023-01-13 09:38:14 · 372 阅读 · 16 评论 -
多线程之wait¬ify
wait 需要搭配 synchronized 使用,sleep 不需要;wait 是 Object 的方法 ,sleep 是 Thread 的静态方法。notify()方法是用来通知同一个对象上等待的线程,对其发出通知notify,并使它们重新获取该对象的对象锁。如果有多个线程等待,则有线程调度器随机挑选出一个呈 wait 状态的线程。notifyAll和notify是非常相似的,当多个线程wait 的时候, notify随机唤醒一个, notifyAll所有线程都唤醒,这些线程再来一起竞争锁。原创 2023-01-11 08:45:50 · 879 阅读 · 25 评论 -
关于volatile解决内存可见性问题(保证线程安全)
volatile是不保证原子性的,原子性是靠synchronized来保证的。但是volatile和synchronized都能保证线程安全。在多线程中,针对同一个变量,一个线程进行读取,一个线程进行修改,那么加上volatile关键字可以保证线程安全问题。原创 2023-01-09 08:45:45 · 1209 阅读 · 26 评论 -
多线程之死锁
发生死锁的三个典型情况:1.一个线程针一把锁连续加锁两次。如果锁是不可重入锁,就会死锁。2.两个线程两把锁,t1先对锁A加锁,t2先对锁B加锁,然后各自再尝试获取对方的锁,就会死锁。3.多个线程多把锁。破除死锁的办法就是给锁编号,然后指定一个固定的顺序(比如从小到大)来加锁。任意线程加多把锁的时候,都让线程遵守上述顺序,此时循环等待就自然破除了。原创 2023-01-07 09:44:40 · 1446 阅读 · 30 评论 -
多线程之线程安全问题
线程安全问题的原因有如下:1.根本原因:线程都是抢占式执行的,随机调度的。2.代码结构原因:多个线程同时修改同一个变量。在有些时候,是可以通过调整代码结构来避免的。一个线程修改一个变量是没问题的,多个线程读取同一个变量也是没有问题的,多个线程修改不同的变量也是没问题的。3.原子性:如果修改操作是原子性的,就可以避免了,针对线程安全问题,最主要的解决手段也是从原子性这个方面进行入手的。4.内存可见性问题:如果一个线程读,一个线程修改,那么此时读取的结果可能不如预期值。5.指令重排序原创 2023-01-05 08:39:17 · 1974 阅读 · 26 评论 -
多线程之Thread类常见方法及线程的状态
Thread类常见方法:创建、启动线程、终止线程、线程等待、获取线程实例、线程休眠。线程的状态:1.NEW创建了Thread对象,但是还没调用start(内核里还没创建对应PCB)。2.TERMINATED表示内核中的pcb已经执行完毕了,但是Thread对象还在。3.RUNNABLE可运行的(正在运行或者就绪)。4.阻塞(WAITING/TIMED_WAITING/BLOCKED),表示线程pcb正在阻塞队列中。原创 2023-01-03 09:07:04 · 2563 阅读 · 24 评论 -
单例模式之饿汉模式&懒汉模式
饿汉模式即使在多线程情况下,也是线程安全的,因为只涉及到读操作。通过对单线程版的懒汉模式不断改进得到了多线程安全的懒汉模式。原创 2022-12-30 08:46:16 · 1397 阅读 · 17 评论 -
Java中创建线程的五种方式
前言:1.进程与线程的区别?2.进程是操作系统进行资源分配的基本单位,而操作系统是以线程为单位进行调度的。3.Java操作多线程,依赖最核心的类Thread。4.关于start和run的区别?5.使用JDK自带的工具jconsole来查看当前java进程中的所有线程。Java中创建线程的五种写法:1.继承Thread,重写run2.实现Runnable接口3.使用匿名内部类,继承Thread4.使用匿名内部类,实现Runable5.使用Lambda表达式原创 2022-12-28 08:04:39 · 1274 阅读 · 15 评论 -
关于对计算机发展史、冯诺依曼体系、CPU基本工作流程以及关于编程语言的简单认识
关于对计算机发展史、冯诺依曼体系、CPU基本工作流程以及关于编程语言的简单认识(Java的前世今生)原创 2022-12-26 11:17:24 · 1050 阅读 · 20 评论 -
浅谈操作系统和进程
操作系统是一个软件,对下要管理硬件设备,对上要给软件运行提供稳定的运行环境。操作系统是软硬件及用户之间交互的媒介。进程是操作系统资源分配的基本单位,每个进程都对应一些资源。在Java中一般会基于文件或网络来进行进程间通信。进程调度相关的属性有进程状态、优先级、上下文和记账信息。原创 2022-12-04 09:29:41 · 1910 阅读 · 26 评论 -
Request请求转发与Respones请求重定向有什么区别?
请求转发即内部资源跳转,重定向即内部外部资源均可跳转。请求转发是浏览器发送请求给服务器,服务器中对应的资源A接收到请求,资源A处理完请求后将请求发给资源B,资源B处理完后将结果响应给浏览器。浏览器发送请求给服务器,服务器中对应的资源A接收到请求,资源A现在无法处理该请求,就会给浏览器响应一个302的状态码+location的一个访问资源B的路径,浏览器接收到响应状态码为302就会重新发送请求到location对应的访问地址去访问资源B,资源B接收到请求后进行处理并最终给浏览器响应结果,这整个过程就叫重定向。原创 2022-12-02 09:34:21 · 762 阅读 · 20 评论 -
猿如意|IntelliJ IDEA Community下载安装以及基础开发设置和快捷键设置的详细教程
IDEA是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。另外,猿如意这个辅助开发工具箱也是非常不错的,本人已经使用多时,感觉nice,非常推荐大家使用。猿如意不仅具有效率工具、开发工具下载模块,而且还有教程文档,代码片段搜索以及全网搜索等功能模块,很强大。原创 2022-11-30 22:51:47 · 2973 阅读 · 4 评论 -
猿如意开发工具|Sublime Text(4126)
使用猿如意下载安装Sublime Text非常方便,不管是下载各种开发工具,还是安装其他的效率工具都是非常方便的。原创 2022-11-30 13:12:03 · 1545 阅读 · 10 评论 -
猿如意开发工具|python3.7
猿如意是一款面向开发者的辅助开发工具箱,包含了效率工具、开发工具下载,教程文档,代码片段搜索,全网搜索等功能模块。帮助开发者提升开发效率,帮你从“问题”找到“答案”,可以说完全是咱们程序猿的如意兵器。原创 2022-11-29 16:10:02 · 1585 阅读 · 22 评论 -
JVM的垃圾回收机制(GC)
JVM的垃圾回收机制(GC):一、什么是垃圾回收?二、java的垃圾回收,要回收的内存是哪些?三、回收堆上的内存,具体是回收什么?四、垃圾回收到底是怎么回收的?五、如何判定垃圾?1.引用计数2.可达性分析(java)六、已经知道哪些对象是垃圾了,具体怎么去回收呢?1.标记-清除2.复制算法3.标记整理4.分代回收原创 2022-11-27 09:48:57 · 1521 阅读 · 28 评论 -
JVM类加载(类加载过程、双亲委派模型)
JVM类加载(类加载过程、双亲委派模型):一、类加载过程二、关于类加载的典型试题三、双亲委派模型原创 2022-11-25 09:42:04 · 887 阅读 · 19 评论 -
JVM的内存区域划分
JVM的内存区域划分:一、本地方法栈(线程私有)二、程序计数器(线程私有)三、Java虚拟机栈(线程私有)四、堆(线程共享)五、方法区(元数据区)原创 2022-11-23 09:11:15 · 1048 阅读 · 27 评论 -
多进程编程
Java多进程编程:Java对操作系统提供的多进程编程接口这些操作进行了限制,最终给用户只提供了两个操作:进程创建(Process process = runtime.exec())和进程等待(int exitCode = process.waitFor();)。原创 2022-11-21 08:42:29 · 1439 阅读 · 31 评论 -
多进程编程 VS 多线程编程
创建线程/销毁线程比创建进程/销毁进程更加高效和轻量。所以,一般情况下,会使用多线程来进行开发。但是,多进程也有它自己独特的优势,进程的“独立性”更好。进程要比线程来的更加稳定一点。虽然进程没有线程那么高效,但是它的独立性带来的稳定是非常关键的,在某些场景下必须使用多进程编程。原创 2022-11-19 09:48:45 · 1478 阅读 · 25 评论 -
Java之IO流
InputStream和FileInputStream是用来读取数据的,即输入;OutputStream和FileOutputStream是用来写入数据的,即输出。FileInputStream和FileOutputStream是专门用来操作文件的,他们是一个类,分别实现了InputStream和OutputStream的接口;Reader和FileReader是用来读取的,即输入的;Writer和FileWriter是用来写入的,即输出的。原创 2022-11-09 08:35:15 · 686 阅读 · 27 评论 -
表白墙服务器版【交互接口、服务器端代码、前端代码、数据存入文件/数据库】
表白墙服务器版【交互接口、服务器端代码、前端代码、数据存入文件/数据库】:一、准备工作二、约定前后端交互接口三、实现服务器端代码四、调整前端页面代码五、数据存入文件六、数据存入数据库原创 2022-10-19 09:31:53 · 7568 阅读 · 51 评论 -
Cookie与Session是如何联动的?
Cookie是由服务器产生的,通过HTTP响应的Set-Cookie字段来进行设置,并返回给浏览器。Cookie是在浏览器这边进行储存的,浏览器会根据域名/地址来分别储存Cookie。在浏览器的下次请求中Cookie会被自动添加到请求中,发送给服务器。Session叫做“会话”,在服务器端进行储存的。Cookie 是客户端的机制,Session 是服务器端的机制。Cookie 和 Session 经常会在网页开发中一起配合使用。Cookie与Session的区别以及他们是如何联动的。原创 2022-10-16 08:55:46 · 4010 阅读 · 49 评论 -
Servlet API 详解(HttpServlet、HttpServletRequest、HttpServletResponse)
我们写 Servlet 代码的时候, 首先第一步就是先创建类, 继承自 HttpServlet, 并重写其中的某些方法。当 Tomcat 通过 Socket API 读取 HTTP 请求(字符串), 并且按照 HTTP 协议的格式把字符串解析成HttpServletRequest 对象。Servlet 中的 doXXX 方法的目的就是根据请求计算得到相应, 然后把响应的数据设置到HttpServletResponse 对象中,按照 HTTP 协议的格式, 转成一个字符串, 并通过 Socket 写回给浏览器原创 2022-10-14 09:14:24 · 1007 阅读 · 31 评论 -
Servlet 的运行原理
一、Tomcat在Servlet运行中的定位1.接收请求:2.根据请求计算响应3.返回响应二、Tomcat 是如何初始化/处理请求的? 1.Tomcat 初始化 2.Tomcat 处理请求 3.Servlet 的 service 方法原创 2022-10-11 10:49:58 · 746 阅读 · 32 评论 -
Tomcat下载、安装及使用介绍
我们使用Tomcat主要的目的就是为了能够部署一个webapp网站。Tomcat 是一个 HTTP 服务器。HTTP 协议就是 HTTP 客户端和 HTTP 服务器之间的交互数据的格式。可以通过 ajax 和 Java Socket 构造HTTP 客户端。HTTP 服务器也可以通过 Java Socket 来实现。而 Tomcat 就是基于 Java 实现的一个开源免费的 HTTP 服务器。原创 2022-10-06 07:56:51 · 1590 阅读 · 38 评论 -
包装类详解(装箱(包)、拆箱(包)、Integer类型缓存)
在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。Integer类型把[-128~127]的数据缓存了,这个范围的数据直接取出,不需要新new对象。原创 2022-09-25 08:40:38 · 1708 阅读 · 22 评论 -
如何实现Cloneable接口?深拷贝和浅拷贝的区别?
1.如何实现Cloneable接口?2. 什么是浅拷贝? 什么是深拷贝?原创 2022-08-13 10:20:04 · 938 阅读 · 33 评论 -
如何实现Comparable和Comparator接口?
如何实现Comparable接口?如何实现Comparator接口?Comparable这个接口只有一个方法,那就是CompareTo。所有想要具有比较功能的类,都建议实现这个接口。Comparator接口包含很多方法,但是真正需要我们实现的只有 int compare(T o1, T o2); boolean equals(Object obj);但是equals方法是从基类Object继承的,有默认的实现。所以真的需要我们实现的只有方法int compare(T o1, T o2)。.........原创 2022-08-11 14:28:21 · 1671 阅读 · 29 评论 -
抽象类和接口
抽象类和接口语法规则,使用规则以及之间的特性。抽象类存在的意义就是为了被继承。一个类可以实现多个接口,使用implements,用逗号隔开,这样可以解决多继承的问题。原创 2022-08-10 16:29:42 · 644 阅读 · 20 评论 -
重载与重写有什么区别?
方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现 。原创 2022-08-07 20:45:00 · 313 阅读 · 8 评论 -
封装、继承和多态
封装就是对类内部的实现细节进行隐藏,然后对类外提供公开的接口。继承其实是父类对子类的共性的抽取, 实现代码的复用。一个引用调用同一个方法,因为这个引用 引用的对象不一样,导致调用这个方法,所表现出来的行为不一样。这种思想就叫做多态。...原创 2022-08-07 09:00:00 · 2269 阅读 · 18 评论