
Java基础
文章平均质量分 92
JavaSE基础、Java网络编程和多线程并发编程
Java架构何哥
从事政务信息化、大数据治理、AI大模型等行业领域。
展开
-
JVM从入门到放弃
关于JVM,其实有很多大厂开发了不同版本的JVM,比较知名的有:Sun HotSpot VM、BEA JRockit VM、IBM J9 VM、 Azul VM、 Apache Harmony、 Google Dalvik VM、 Microsoft JVM等等。现在使用的比较多的JDK8版本就是Sun HotSpot VM与BEA JRockit VM合并之后开发出的JDK版本。原创 2024-08-04 23:36:19 · 1382 阅读 · 0 评论 -
Java设计模式—观察者模式
前言:在现实世界中,许多对象并不是独立存在的,其中一个对象的行为发生改变可能会导致一个或者多个其他对象的行为也发生改变。例如,某种商品的物价上涨时会导致部分商家高兴,而消费者伤心;还有,当我们开车到交叉路口时,遇到红灯会停,遇到绿灯会行。在软件世界也是这样,例如,Excel 中的数据与折线图、饼状图、柱状图之间的关系;MVC 模式中的模型与视图的关系;事件模型中的事件源与事件处理者。所有这些,如果用观察者模式来实现就非常方便。一、观察者模式简介1.1、观察者模式概述观察者模式(Observer原创 2021-09-21 19:07:18 · 10841 阅读 · 4 评论 -
Java并发编程:两个线程交替打印0-100的奇偶数
问题描述:两个线程交替打印输出数字,一个线程只打印偶数,另一个只打印奇数方案一:使用synchronized关键字 创建两个线程,一个线程处理偶数,一个线程处理奇数,两个线程之间通过synchronized进行同步,保证count++每次只有一个线程进行操作 为什么两个线程能交替执行,这里很巧的是count从0123...自增过程就是一个奇偶数交替的过程,实际上两个线程都是在不停的尝试(while循环)进入synchronized代码块,如果满足相对应的条件(偶数或是奇数)就打印输出。原创 2021-09-16 17:14:22 · 4040 阅读 · 0 评论 -
Java中nio、bio和aio的区别
前言:IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。现在使用NIO的场景越来越多,很多网上的技术框架或逐渐使用NIO技术,譬如Tomcat、Jetty,还有基于nio的网络编程框架Netty。一、什么是NIO?1.1、高并发量引起的问题一个使用传统阻塞I/O的系统,如果还是使用传统的一个请求对应一个线程这种模式,一旦有高并发的大量请求,就会有如下问题:1、线程不够用, 就算使用了线程池复用线程也无济于事;2、阻塞I/O模式下,会有大量的线程被阻塞,..原创 2021-09-14 01:19:48 · 9373 阅读 · 3 评论 -
Java多线程14:CopyOnWriteArrayList 写时复制
前言:我们知道ArrayList是线程不安全的。要实现线程安全的List,我们可以使用Vector,或者使用Collections工具类将List包装成一个SynchronizedList。其实在Java并发包中还有一个CopyOnWriteArrayList可以实现线程安全的List。1、VectorVector这个类是一个非常古老的类了,在JDK1.0的时候便已经存在,其实现安全的手段非常简单所有的方法都加上synchronized关键字,这样保证这个实例的方法同一时刻只能有一个线程访问,所以在原创 2021-09-14 00:14:21 · 1828 阅读 · 0 评论 -
Java多线程13:手写生产者-消费者模式
一、Object的wait、notify和notifyAll方法1.1、wait方法当一个线程调用一个共享变量的wait()方法时,该调用线程会被阻塞挂起(进入waiting状态),直到发生下面几件事情之一才能返回:其他线程调用了该共享对象的notify()或者notifyAll()方法; 其他线程调用了该线程的interrupt()方法,该线程抛出InterruptedException异常返回。另外需要注意的是,如果调用wait()方法的线程没有事先获取该对象的监视器锁,则调用w...原创 2021-09-12 02:50:15 · 2423 阅读 · 0 评论 -
Java多线程12:线程池总结
前言:在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁,这就是"池化资源"技术产生的原因。线程池中的线程是可以重复使用的。一、Java线程池简介1.1、线程池定义线程池(thread pool)顾名思义就是事先创建若干个可执行的线程放入一个池(容器)中,需要的时候从池原创 2021-09-11 01:49:13 · 776 阅读 · 0 评论 -
Java多线程11:并发编程的核心AQS
前言:如果你想深入研究Java并发编程的话,那么AQS一定是绕不开的一块知识点,Java并发包很多的同步工具类底层都是基于AQS来实现的,比如我们工作中经常用的Lock工具ReentrantLock、栅栏CountDownLatch、信号量Semaphore等。而且关于AQS的知识点也是面试中经常考察的内容,为了应付面试,深入学习AQS很有必要。...原创 2021-09-11 00:16:35 · 601 阅读 · 3 评论 -
Java多线程10:并发编程的基石CAS机制
前言:synchronized保证了线程安全,但是在某些情况下,却不是一个最优选择,关键在于性能问题。Java中提供了很多原子操作类来保证共享变量操作的原子性。这些原子操作的底层原理都是使用了CAS机制。一、CAS机制简介1.1、悲观锁和乐观锁更新数据方式CAS机制是一种数据更新的方式。在具体讲什么是CAS机制之前,我们先来聊下在多线程环境下,对共享变量进行数据更新的两种模式:悲观锁模式和乐观锁模式。悲观锁更新的方式认为:在更新数据的时候大概率会有其他线程去争夺共享资源,所以悲观锁的做...原创 2021-09-10 01:13:21 · 591 阅读 · 0 评论 -
Java多线程9:ThreadLocal原理和使用场景
前言:面试官经常会问到 ThreadLocal 是什么?他其实想考察候选人对ThreadLocal的定义、原理和应用场景的了解程度。一、ThreadLocal定义ThreadLocal,线程本地变量,顾名思义,它是每个线程私有的本地变量。通俗点讲,当你创建了一个ThreadLocal变量,每个线程在访问该变量时,都会拷贝一个副本至本地内存,所以多线程下操作ThreadLocal变量时,其实各自都是在操作自己拷贝的副本,互不影响,这样自然而然就避免了线程安全问题。ThreadLocal有点类似原创 2021-09-09 01:16:12 · 4179 阅读 · 0 评论 -
Java多线程8:Volatile原理和使用场景
前言:volatile关键字是Java提供的一种轻量级的同步机制,在并发编程中,它也扮演着比较重要的角色。一个硬币具有两面,volatile不会造成上下文切换的开销,但是它也并能像synchronized那样保证所有场景下的线程安全,因此我们需要在合适的场景下使用volatile机制。大家都应该知道 volatile 的主要作用有两点:保证变量的内存可见性和禁止指令重排序。那么,什么是内存可见性,什么是指令重排序,以及它们涉及了那些机制原理呢?一、基本概念1.1、Java内存模型Java的原创 2021-09-09 00:42:32 · 2982 阅读 · 0 评论 -
Java多线程7:ReentrantReadWriteLock读写锁
1、ReadWriteLock接口简介ReadWriteLock接口是一个单独的接口(未继承Lock接口),该接口提供了获取读锁和写锁的方法。所谓读写锁,是一对相关的锁——读锁和写锁,读锁用于只读操作,写锁用于写入操作。读锁可以由多个线程同时保持,而写锁是独占的,只能由一个线程获取。接口定义public interface ReadWriteLock { /** * Returns the lock used for reading. * * @r原创 2021-09-07 17:30:58 · 373 阅读 · 0 评论 -
Java多线程6:ReentrantLock同步锁
前言:Java除了使用关键字synchronized外,还可以使用ReentrantLock实现独占锁的功能。而且ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵活,也更适合复杂的并发场景。这篇文章主要是从使用的角度来分析一下ReentrantLock。一、Lock接口简介1.1、Lock接口概述在JUC包下面有一个java.util.concurrent.locks包,这个包提供了一系列基础的锁工具,对传统的synchronizd、wait和notif原创 2021-09-07 17:21:12 · 1680 阅读 · 0 评论 -
Java多线程5:synchronized和Lock区别
一、锁类型可重入锁:在执行对象中所有同步方法不用再次获得锁 可中断锁:在等待获取锁过程中可中断 公平锁: 按等待获取锁的线程的等待时间进行获取,等待时间长的具有优先获取锁权利 读写锁:对资源读取和写入的时候拆分为2部分处理,读的时候可以多线程一起读,写的时候必须同步地写线程安全这个概念可能是在多线程编程中提及最多的一个概念了。关于这个概念,我觉得好多人都有一个误区,包括我自己一开始也是这样的。我一开始认为线程安全讲的是某个共享变量线程安全,其实我们所说的线程安全是指某段代原创 2021-09-06 17:03:29 · 1035 阅读 · 1 评论 -
Java多线程4:synchronized的使用场景和原理简介
一、synchronized使用1.1 synchronized介绍在多线程并发编程中synchronized一直是元老级角色,很多人都会称呼它为重量级锁。但是,随着Java SE 1.6对synchronized进行了各种优化之后,有些情况下它就并不那么重了。synchronized可以修饰普通方法,静态方法和代码块。当synchronize...原创 2021-09-06 16:03:15 · 3944 阅读 · 0 评论 -
Java多线程3:锁分类总结
一、锁简介1、锁的概念锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能防止多个线程同时访问共享资源(但是有些锁可以允许多个线程并发的访问共享资源,如读写锁)。在以前,Java程序是靠synchronized来实现锁功能的,而在JavaSE5之后,并发包中新增了Lock接口(以及相关实现类)用来实现锁功能,他提供了与synchronized关键字类似的同步功能,只是在使用时需要显式的获取锁和释放锁,虽然它缺少了synchronized提供的隐式获取释放锁的便捷性,但是却拥有了锁获取和释放..原创 2021-09-05 01:09:00 · 922 阅读 · 0 评论 -
Java多线程2:确保三个线程顺序执行
前言:三个线程t1、t2、t3。确保三个线程顺序执行,t1执行完后t2执行,t2执行完后t3执行。1、使用jointhread.Join 把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程 B 中调用了线程 A 的 join(),直到线程 A 执行完毕后,才会继续执行线程 B。public class ThreadTest1 { // T1、T2、T3三个线程顺序执行 public static void main(String[] arg原创 2021-04-13 22:21:16 · 2173 阅读 · 0 评论 -
Java多线程1:CountDownLatch计数器
前言:多个线程同时查询一张表,最后汇总查询结果返回,那么就存在一个问题,如何判断多个线程是否全部已经处理完成。一、CountDownLatch简介1、CountDownLatch概念CountDownLatch是多线程控制的一种工具,它被称为门阀、计数器或者闭锁。这个工具经常用来用来协调多个线程之间的同步,使一个线程等待其他线程各自执行完毕后再执行。CountDownLatch是在Java1.5被引入,存在于java.util.cucurrent包下。跟它一起被引入的工具类还有Cy...原创 2021-03-26 00:11:06 · 1886 阅读 · 0 评论 -
Java网络编程:Socket和WebSocket
一、Socket总结1、Socket简介在计算机通信领域,Socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定。通过 Socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。Socket所处层次图中可以看到Socket是应用层与TCP/IP协议族通信的中间软件抽象层,就是提供了tcp/ip协议的抽象,对外提供了一套接口,同过这个接口就可以统一方便的使用tcp/ip协议的功能。2、Socket常用方法图解图片来源于网络,侵删3、Soc.原创 2020-06-28 12:39:23 · 3394 阅读 · 0 评论 -
Java 8版本的十大新特性
前言:越来越多的项目已经使用 Java 8了,毫无疑问,Java 8是Java自Java 5(发布于2004年)之后的最重要的版本。这个版本包含语言、编译器、库、工具和 JVM 等方面的十多个新特性。Java 8是一次变化巨大的更新,耗费了工程师大量的时间,还借鉴了很多其它语言和类库。一、Lambda表达式Lambda表达式可以说是Java 8最大的卖点,她将函数式编程引入了Java。Lambda允许把函数作为一个方法的参数,或者把代码看成数据。一个Lambda表达式可以由用逗号分隔的参数列表、原创 2020-06-19 17:58:41 · 2763 阅读 · 0 评论 -
Java进阶知识8:Integer包装类的两个巨坑
1、为什么Integer包装类中128==128为false,而100==100为true?如果你运行下面的代码:public class Test{ public static void main(String[] args) { Integer a = 128, b = 128; System.out.println(a == b);//1 Integer c = 100, d = 100; System.out原创 2021-03-25 18:33:36 · 479 阅读 · 1 评论 -
Java进阶知识7:try-catch-finally中的4个巨坑
前言:在 Java 语言中 try-catch-finally 看似简单,一副人畜无害的样子,但想要真正的掌握它,却并不是一件容易的事。别的不说,咱就拿 fianlly 来说:finally 中的代码一定会执行吗?如果是之前我会毫不犹豫的说“是的”,但在遭受了面试官的毒打之后,我会这样回答:正常情况下 finally 中的代码一定会执行的,但如果遇到特殊情况 finally 中的代码就不一定会执行了。如果 try-catch-finally 中存在 return 返回值的情况,一定要确保 return 语句原创 2021-03-18 23:26:52 · 755 阅读 · 1 评论 -
Java进阶知识6:利用Comparable或Comparator接口实现对象排序
前言:排序算法是我们初学程序时常用的算法,每个人都尝试过排序,但只是局限于基本数据类型的简单排序。比如:将下列数字进行排序1,3,5,8,3,6,于是我们得出结果1,3,3,5,6,8。将下列字母(字符)进行排序 a,i,e,f,w,s 于是我们得出结果 a,e,f,i,s,w。但是我们工作后遇到的情况就不是如此简单了。比如给公司里的商品进行排序,我们很轻易的想到按照商品的名称排序不就完了,而且简单明了。但现实并如我们相信那般简单。同一商品名称可以有不同的进货时间,可能还会有进货单价的不同,这显然只根...原创 2020-06-18 16:25:36 · 2672 阅读 · 0 评论 -
Java进阶知识5:自定义注解完成某个目的
一、举个栗子我要写一个测试框架,测试程序员的代码有无明显的异常。—— 程序员 A : 我写了一个类,它的名字叫做 NoBug,因为它所有的方法都没有错误。—— 我:自信是好事,不过为了防止意外,让我测试一下如何?—— 程序员 A: 怎么测试?—— 我:把你写的代码的方法都加上 @Jiecha 这个注解就好了。—— 程序员 A: 好的。待测试的Nobug类:pa...原创 2019-10-03 13:56:53 · 488 阅读 · 1 评论 -
Java进阶知识4:注解
前言:注解目前非常的流行,很多主流框架都支持注解,特别是在Java SSM框架之中存在各种注解,因为后续会学习这几个框架,所有需要先将这几个框架中要用到的知识点反射机制和注解先学习一下。日常项目中我们也可以用到注解,编写代码更简洁高效。一、注解的概念Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。Java 语言中的类、方法、变量、参数...原创 2019-10-02 12:32:32 · 2359 阅读 · 0 评论 -
Java进阶知识3:反射机制应用于Java SSM框架
前言:Java SSM框架里面经常用到反射机制,相信大家都用过Spring或者MyBatis等等这类框架,在使用这类框架的时候,免不了与该框架的XML配置文件打交道,在很多配置的地方都会填写一个全类名。看过源码的同学应该就知道,因为这些框架会先解析XML配置文得件得到这个全类名,然后通过这个全类名来得到Class对象,完成后面的反射调用的动作。比如Spring中,通过第三方配置文件实现对象的控制。...原创 2019-10-02 08:28:19 · 1439 阅读 · 0 评论 -
Java进阶知识2:反射机制
前言:反射是Java Web框架设计的灵魂。作为Java Web框架中必不可少的反射机制,比如Spring的IOC控制反转(通过第三方配置文件实现对象的控制)就会经常用到。反射是Java中一种强大技术,能够使我们很方便的创建灵活的代码,通过获取配置文件的class名,这些代码可以在运行时装配,无需在组件之间进行源代码链接,降低了代码的耦合度。但是要注意反射使用不当的话会成本很高。一、Java反...原创 2019-10-02 07:27:13 · 3956 阅读 · 0 评论 -
Java进阶知识1:泛型
前言:自JDK 1.5 之后,Java 引入泛型解决了集合容器类型安全这一问题。泛型在Java中有很重要的地位,在集合容器及各种设计模式中有非常广泛的应用。一般的类和方法,只能使用具体的类型,要么是基本类型,要么是自定义的类。如果要编写可以应用多种类型的代码,这种刻板的限制对代码得束缚会就会很大。——《Thinking in Java》一、泛型的概念泛型就是参数化类型,把类型明确的工作推...原创 2019-10-01 16:59:10 · 682 阅读 · 0 评论 -
Java基础27:Servlet实现一对多映射URL
前言:打脸了,前脚刚说过要跟Servlet正式告别。结果最近的面试被问到了同一个Servlet可不可以被映射到多个URL上,也就是如何用一个Servlet实现多个功能。前置知识:Servlet容器如何处理请求资源路径? 1、这个地址 http://localhost:8080/ttms1.01/indexUI.do 什么是请求资源路径? 在地址栏中输入的请求地址中,端口号之后的部分都是请求资源路径。 紧跟端口号的是部署到Web服务器上的应用名(appName) ...原创 2020-06-29 18:32:38 · 3798 阅读 · 0 评论 -
Java基础26:String字符串常用函数
前言:不管是技术面试还是日常工作中,都会经常遇到字符串处理算法,比如最长公共序列、最长公共子串和最长回文子串就属于字符串处理的常见操作。我们除了要掌握相关的动态规划算法,还得熟悉常用的Java字符串处理方法。1、获取int length() : 返回此字符串的长度,也就是字符串中的包含的字符数。char charAt(int index): 返回指定索引处的char值int indexOf(int ch):返回的是ch在字符串中第一次出现的索引位置int indexOf(int ch.原创 2020-06-17 19:09:49 · 943 阅读 · 0 评论 -
Java基础25:日历编程
需求:编写程序,提示用户输入年份和输入月份,然后在控制台上显示某年某个月份的日历。(已知1990年1月1日是星期一)主要的知识点: 基础的循环和条件分支语句,如:switch,for,条件运算符(?:)和取余运算符% 方法参数和返回值的灵活使用; import java.util.Scanner;//我的日历,已知1990年1月1日是星期一public class...原创 2019-10-01 05:12:19 · 610 阅读 · 0 评论 -
Java基础24:对象向上转型和向下转型
前言:Java中的继承机制使得一个类可以继承另一个类,继承的类称为子类,被继承的类称为父类。在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象,所以子类可以继承父类中所有的属性和方法,包括private修饰的属性和方法,但是子类只是拥有父类private修饰的属性和方法,却不能直接使用它,也就是无法直接访问到它(子类可以通过调...原创 2019-10-01 04:17:20 · 1060 阅读 · 0 评论 -
Java基础23:面向对象特征之多态
前言:面向对象编程有三大特性:封装、继承和多态。封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法; 继承是为了重用父类代码,两个类若存在IS-A的关系就可以使用继承,同时继承也为实现多态做了铺垫。从一定角度来看,封装和继承几乎都是为多态而准备的,这是非常重要的知识点。多态(Polymorphism)...原创 2019-10-01 03:28:01 · 358 阅读 · 0 评论 -
Java基础22:Cloneable和Serializable接口
一、Cloneable接口在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同的新对象B,并且此后对B任何改动都不会影响到A中的值。也就是说,A与B是两个独立的对象,但B的初始值是由A对象确定的。在Java语言中,用简单的赋值语句是不能满足这种需求的,需要使用clone。clone:它允许在堆中克隆出一块和原对象一样的对...原创 2019-10-01 00:36:32 · 879 阅读 · 0 评论 -
Java基础21:异常处理机制
一、Java异常的概念Java的异常(Exception)又称为例外,指在程序运行时可能出现的一些错误,如:文件找不到、网络连接失败、数组越界等。异常是一个不正常事件,它发生在程序运行期间,中断了正在执行的程序的正常指令流。为了能够及时有效地处理程序中的运行错误,Java 专门引入了异常类Throwable,通过抛出异常和捕捉异常及时处理这些例外情况,否则程序将直接崩溃。1、Java所...原创 2019-09-30 03:31:05 · 492 阅读 · 0 评论 -
Java基础20:public、private、protected和default的区别
前言:public、private、protected和default是Java类的属性和方法成员的访问控制修饰符,即对象.属性/方法访问区别:public:可以被所有其他类所访问private:只能被自己访问和修改protected:自身、子类及同一个包中类可以访问default:同一包中的类可以访问,声明时没有加修饰符,认为是friendly。public:具有...原创 2019-01-27 04:58:04 · 531 阅读 · 0 评论 -
Java基础19:Object类
前言:Java中,Object类是一个特殊的类,是所有类的父类。如果一个类没有用extends明确指出继承于某个类,那么Java会自动把Object作为要定义类的超类,可以使用类型为Object的变量指向任意类型的对象。但Object类的对象变量只能用作各种对象的通用持有者。要对他们进行任何专门的操作,都需要知道它们的原始类型并进行类型转换。例如:Object obj = new MyObje...原创 2019-01-26 16:38:45 · 1121 阅读 · 0 评论 -
Java基础18:设计模式学习总结
直接去看两位大神的博客学习:一、Java 设计模式学习总结二、从Android代码中来记忆23种设计模式原创 2017-09-11 21:42:37 · 443 阅读 · 0 评论 -
Java基础17:Java连接Mysql进行增删改查操作
一、Java如何使使用JDBC连接MySQL数据库?1、JDBC(Java Data Base Connectivity,Java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。2、Java连接MySQL需要驱动包,最...原创 2017-09-11 21:14:07 · 717 阅读 · 0 评论 -
Java基础16:进程间和线程间的通信方式
一、进程间的通信方式进程间通信又称IPC(Inter-Process Communication),指多个进程之间相互通信,交换信息的方法。根据进程通信时信息量大小的不同,可以将进程通信划分为两大类型:1、低级通信:控制信息的通信(主要用于进程之间的同步,互斥,终止和挂起等等控制信息的传递)信号量(semophore ) :信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常...原创 2017-09-11 20:43:28 · 2361 阅读 · 0 评论