自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Yorick.Xu的技术进化史

记录我的成长

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

原创 第二课 简单的客户端服务端通信

简单的客户端服务端通信1 TCP/IP 编程练习1.1 基于TCP的Socket通信1.2 例题1:客户端向服务器发送一段话1.3 例题2:客户端向服务器发送文件2 UDP 编程练习2.1 基于 UDP 的Socket通信2.2 例题1:发送数据到服务器3 URL 编程3.1 解析URL3.2 从 Tomcat 服务器上下载图片1 TCP/IP 编程练习1.1 基于TCP的Socket通信Java语言的基于套接字编程分为服务端编程和客户端编程,其通信模型如图所示:客户端Socket的工作过

2021-03-10 23:01:54 184

原创 第一课 网络编程概述

网络编程概述1 网络概述2 通信要素一:IP和端口号2.1 IP地址2.2 端口号3 通信要素二:网络通信协议3.1 TCP协议3.2 UDP协议4 URL(Uniform Resource Locator,统一资源定位符)4.1 基本介绍4.2 URI/URL/URN1 网络概述网络编程的目的:直接或间接地通过网络协议与其他计算机实现数据交换,进行通讯网络编程中有两个主要问题如何准确地定位网络上一台或多台主机:定位主机上的特定的应用找到主机后如何可靠高效的进行数据传输网络通信协议:计算

2021-03-10 23:00:39 458

原创 第六课 NIO.2 & 自动资源管理

NIO.2 & 自动资源管理1 NIO.21.1 Path 与 Paths1.2 File 类2 自动资源管理1 NIO.2JDK7 发布后,Java 对 NIO进行了极大的扩充,增强了对文件处理和文件系统特性的支持。我们称之为 NIO.2。因为 NIO 提供的一些功能,NIO已经成为文件处理中越来越重要的部分1.1 Path 与 Pathsjava.nio.file.Path接口代表一个平台无关的平台路径,描述了目录结构中文件的位置Paths 提供的get()方法用来获取 Path

2021-02-27 11:52:15 139

原创 第五课 管道

管道Java NIO 管道(Pipe)是两个线程之间的单向数据连接。Pipe有一个 source 通道和一个 sink 通道。数据会被写到 sink 通道,从 source 通道读取。package NIO;import java.io.IOException;import java.nio.ByteBuffer;import java.nio.channels.Pipe;public class TestPipe { public static void main(String[

2021-02-27 11:50:25 120

原创 第四课 阻塞与非阻塞

阻塞与非阻塞1 使用 NIO 完成网络通信的三个核心2 选择器(Selector)2.1 SelectableChannle 的结构2.2 选择器的应用2.3 SelectionKey 选择键(ops参数)2.4 SelectionKey 的常用方法2.5 Selector 的常用方法3 网络通信中的常用通道3.1 SocketChannel 与 ServerSocketChannel3.2 DatagramChannel传统的 IO 流都是阻塞式的。也就是说,当一个线程调用 read() 或 wri

2021-02-27 11:47:58 146

原创 第三课 通道

通道1 通道(Channel)2 通道的主要实现类3 获取通道4 通道之间的数据传输(直接缓冲区)5 分散(Scatter)与聚集(Gather)6 字符集(Charset)1 通道(Channel)通道(Channel):用于源节点与目标节点的连接。在Java NIO中负责缓冲区中数据的传输。Channel本身不存储数据,因此需要配合缓冲区进行传输。现代计算机中通道集成于专用的处理器中,专门用于处理IO请求,提高效率。2 通道的主要实现类java.nio.channels.Channel

2021-01-06 22:22:26 213

原创 第二课 缓冲区

缓冲区1 缓冲区(Buffer)1.1 缓冲区基本类型1.2 缓冲区存取数据的两个核心方法1.3 缓冲区中的四个核心属性1.4 Buffer的常用方法2 直接缓冲区与非直接缓冲区1 缓冲区(Buffer)1.1 缓冲区基本类型在Java NIO中,负责数据的存取。缓冲区底层实现使用数组,用于存储不同类型的数据。根据数据类型不同(boolean除外),提供了相应类型的缓冲区。ByteBufferCharBufferShortBufferIntBufferLongBufferFloatBu

2021-01-06 22:21:14 275 1

原创 第一课 NIO简介

NIO简介1 Java NIO 简介2 Java NIO 和 IO 的主要区别1 Java NIO 简介Java NIO(New IO)是从Java1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。2 Java NIO 和 IO 的主要区别传统的流都是单向流:输入和输出需要建立两个流,输入流和输出流NIO基于缓冲区

2021-01-06 22:19:49 60

原创 第七课 分支合并框架(Fork/Join框架)

分支合并框架(Fork/Join框架)1 工作窃取模式2 实际使用1 工作窃取模式当执行新的任务时,可以将其拆分成更小的任务执行,并将小任务加到线程队列中。然后再从一个随机线程的队列中偷取一个并把它放在自己的队列中。相对于一般的线程池实现,fork/join框架的优势体现在对其中包含的任务的处理方式上,在一般的线程池中,如果一个线程正在执行的任务由于某些原因无法继续运行,那么该线程会处于等待状态。而在fork/join框架实现中,如果某个子问题由于等待另外一个子问题的完成而无法继续运行。那么处理该子问

2020-09-08 21:50:00 128

原创 第六课 线程池

线程池1 线程池2 线程池的体系结构3 工具类:Excutors4 线程调度1 线程池提供了一个线程队列,队列中保存着所有等待状态的线程。避免了创建与销毁的额外开销,提高了响应速度2 线程池的体系结构3 工具类:Excutors更方便的工厂方法获取可用线程方法名方法解释newFixedThreadPool(int 线程数)创建固定大小的线程池newCachedThreadPool()缓存线程池,线程池的数量不固定,可以根据需求自动的更改数量newSi

2020-09-08 21:49:28 69

原创 第五课 线程八锁

线程八锁1 线程八锁2 线程八锁的关键1 线程八锁问题引入:判断打印的是“one” 还是 “two”1 两个普通同步方法,两个线程,标准打印打印结果 One Twopackage JUC;/** * 线程八锁:第一锁——两个普通同步方法,两个线程,标准打印 * * @author Yorick * */public class TestThreadMoniter { public static void main(String[] args) { Numbe

2020-09-08 21:49:00 73

原创 第四课 同步锁

同步锁1 同步锁2 生产者消费者案例——虚假唤醒2.1 引入2.2 虚假唤醒3 Condition线程通讯——生产者消费者模式升级4 线程按序交替1 同步锁用于解决多线程安全问题的方式同步代码块同步方法同步锁(Java1.5之后),是一个显式的锁,需要通过lock()方法上锁,必须通过unlock()方法释放锁,为了保证一定执行,一般放在finally代码块中package JUC;import java.util.concurrent.locks.Lock;import jav

2020-09-08 21:48:24 103

原创 第三课 闭锁及Callable接口的实现

闭锁及Callable接口的实现1 闭锁2 Callable接口的实现1 闭锁闭锁:在完成某些运算时,只有其他所有线程的运算全部完成,当前运算才能继续执行package JUC;import java.util.concurrent.CountDownLatch;/** * 模拟多线程程序全线程运行结束时长 * * @author Yorick * */public class CountDownLatchTest { // 创建countDownLatch变量时传入的5是

2020-09-08 21:47:51 74

原创 第二课 ConcurrentHashMap锁分段机制

ConcurrentHashMap锁分段机制1 HashTable的弊端2 ConcurrentHashMap锁分段机制1 HashTable的弊端传统的HashTable会将哈希表整体锁住,导致原本的并行操作转换成串行化操作,提高了数据的一致性,但是性能很低,由于使用锁的机制,会导致复合操作线程不安全的问题,如:“若不存在则添加”。这种复合操作需要两步操作,首先需要判断是否存在,之后进行添加操作,两个方法均存在锁机制,如果判断是否存在的方法执行权被剥夺,则会产生严重的线程安全问题2 Concur

2020-09-08 21:47:17 219

原创 第一课 内存可见性问题(volatile关键字)

内存可见性问题(volatile关键字)1 内存可见性问题逐步解决(一个线程读,一个线程写)1.1 原始问题(内存可见性问题现象)1.2 通过加锁的方式解决线程可见性问题1.3 通过volatile关键字解决线程可见性问题2 原子性问题(两个线程均存在读写操作)2.1 原始问题(原子性问题现象)2.2 原子变量Java在1.5之后的版本中加入了JUC(java.util.concurrent包)内存可见性问题:当多个线程操作共享数据时,彼此不可见JVM会为每一个线程分配独立的缓存用于提高效率1

2020-09-08 21:46:47 110

原创 第八课 Apache-DBUtils实现CRUD操作

Apache-DBUtils实现CRUD操作1 Apache-DBUtils简介2 主要API的使用2.1 DbUtils2.2 QueryRunner类1 Apache-DBUtils简介commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。API介绍:org.apache.commons.dbutils.QueryRunnero

2020-08-29 21:59:29 604

原创 第七课 数据库连接池

数据库连接池1 JDBC数据库连接池的必要性2 数据库连接池技术3 多种开源的数据库连接池4 C3P0数据库连接池5 DBCP数据库连接池6 Druid(德鲁伊)数据库连接池1 JDBC数据库连接池的必要性在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤:在主程序(如servlet、beans)中建立数据库连接进行sql操作断开数据库连接这种模式开发,存在的问题:普通的JDBC数据库连接使用 DriverManager 来获取,每次向数据库建立连接的时候都要将 Co

2020-08-29 21:56:51 151

原创 第六课 数据库事务_DAO

数据库事务_DAO1 事务模拟(银行转账)2 JDBC中设置数据库隔离级别3 补充操作4 DAO及相关实现类1 事务模拟(银行转账)哪些操作会导致数据的自动提交DDL操作一旦执行,都会自动提交,关闭自动提交对其无效DML操作默认情况下自动提交,可以关闭自动提交后不再自动提交默认关闭连接时,会自动提交/* * 事务模拟:转账模拟 */public static void test01() { Connection conn = null; try { conn = JDBC

2020-08-27 20:22:15 107

原创 第五课 批量操作

批量操作1 批量执行SQL语句2 实现层次一:使用Statement3 实现层次二:使用PreparedStatement4 实现层次三:使用Batch的方式进行批量插入操作5 实现层次四:更改提交方式1 批量执行SQL语句当需要成批插入或者更新记录时,可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率JDBC的批量处理语句包括下面三个方法:addBatch(String):添加需要批量处理的SQL语句或是参数;execute

2020-08-27 20:18:23 181

原创 第四课 BLOB类型

BLOB类型1 MySQL BLOB类型1 MySQL BLOB类型MySQL中,BLOB是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据。插入BLOB类型的数据必须使用PreparedStatement,因为BLOB类型的数据无法使用字符串拼接写的。MySQL的四种BLOB类型(除了在存储的最大信息量上不同外,他们是等同的)实际使用中根据需要存入的数据大小定义不同的BLOB类型。需要注意的是:如果存储的文件过大,数据库的性能会下降。如果在指定了相

2020-08-27 20:16:38 673

原创 第三课 使用PreparedStatement实现CRUD操作

使用PreparedStatement实现CRUD操作1 操作和访问数据库2 使用Statement操作数据表的弊端3 PreparedStatement的使用3.1 PreparedStatement介绍3.2 PreparedStatement vs Statement3.3 使用(增删改)3.4 使用(查)3.3 Java与SQL对应数据类型转换表4 Statement VS PreparedStatement5 execute()方法1 操作和访问数据库数据库连接被用于向数据库服务器发送命令

2020-08-27 20:15:11 202

原创 第二课 获取数据库连接

第二课 获取数据库连接1 要素一:Driver接口实现类1.1 Driver接口介绍1.2 加载与注册JDBC驱动2 要素二:URL3 要素三:用户名和密码4 五种连接方式(逐步完善)4.1 方式一4.2 方式二(反射替代第三方API)4.3 方式三(DriverManager替代Driver获取Connection对象)4.4 方式四(方式三精简版)4.5 方式五(最终版:使用配置文件版)1 要素一:Driver接口实现类1.1 Driver接口介绍java.sql.Driver接口是所有 JDB

2020-08-27 20:13:44 85

原创 第一课 JDBC概述

JDBC概述1 数据的持久化2 Java中的数据存储技术3 JDBC介绍4 JDBC体系结构5 JDBC程序编写步骤1 数据的持久化持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用。大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以”固化”,而持久化的实现过程大多通过各种关系数据库来完成。持久化的主要应用是将内存中的数据存储在关系型数据库中,当然也可以存储在磁盘文件、XML数据文件中。2 Java中的数据存储技术在Java中,

2020-08-27 20:12:37 122

原创 第五课 动态代理

动态代理1 代理设计模式2 动态代理实现1 代理设计模式什么是动态代理动态代理是指客户通过代理类来调用其他对象的方法,并且是在程序运行时根据需要动态创建目标类的代理对象。使用一个代理将对象包装起来,然后用该代理对戏那个取代原始对象。任何对原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上动态代理使用场合调试远程方法调用动态代理相比于静态代理的优点抽象角色中(接口)声明的所有方法都被转移到调用处理器一个集中的方法中处理,这样,可以更加

2020-08-27 19:58:57 92

原创 第四课 调用运行时类的多种结构

调用运行时类的多种结构1 调用运行时类中指定属性2 调用运行时类中指定方法3 调用运行时类中构造器1 调用运行时类中指定属性/* * 获取public权限的属性值 */public static void test01() throws Exception { Class clazz = PersonFull.class; // 实例化对象 PersonFull p1 = (PersonFull) clazz.newInstance(); // 获取属性:只能获取public权限的属性值,

2020-08-27 19:57:11 91

原创 第三课 获取运行时类的多种结构

获取运行时类的多种结构1 获取属性1.1 获取属性结构1.2 获取属性相关信息2 获取方法2.1 获取方法结构2.2 获取方法相关信息3 其他信息的获取3.1 获取构造器结构3.2 获取父类结构3.3 获取其他结构1 获取属性1.1 获取属性结构方法返回值所获取内容getFields()Field[]获取当前运行时类及其父类中声明为public权限的属性getDeclaredFields()Field[]获取当前运行时类中声明的所有属性(不包含父类中声明的属性)

2020-08-27 19:56:09 129

原创 第二课 Class类的理解

Class类的理解1 类的加载过程2 获取Class实例的方式3 有Class对象的类型4 类的加载过程5 ClassLoader6 创建运行时类的对象及动态性演示1 类的加载过程程序经过javac.exe命令编译后,产生一个或多个字节码文件(.class文件)使用java.exe命令对某个字节码文件进行解释运行。相当于将某个字节码文件加载到内存中,此过程称为类的加载。加载到内存中的类,称之为运行时类,此运行时类就作为Class的一个实例加载到内存中的运行时类,会缓存一定的时间,在此时间之内,我们

2020-08-27 19:54:59 355

原创 第一课 反射概述

反射概述1 Java Reflection概述2 动态语言和静态语言3 Java反射机制提供的功能4 反射相关的主要API5 相关疑问1 Java Reflection概述Reflection(反射):视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任何对象的内部属性及方法加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构

2020-08-19 11:51:46 165 1

原创 第五课 锁

锁1 线程同步2 同步块3 单例设计模式4 死锁——生产者消费者模式4.1 模拟死锁现象4.2 生产者消费者模式(信号灯法)5 任务调度(Timer类)1 线程同步由于同一进程的多个线程共享同一片存储空间,会引起访问冲突问题。/** * 使用锁模拟12306 * * @author Administrator * */public class ThreadSynchronizedTest { public static void main(String[] args) { //

2020-08-13 16:31:37 116

原创 第四课 线程基本信息

方法功能isAlive()判断线程是否还“活”着,即线程是否还未终止getPriority()获得线程的优先级数值setPriority(int num)设置线程的优先级数值setName(String name)给线程定义名称getName()取得线程名称currentThread()取得当前正在运行的线程对象public class ThreadInfoTest { public static void main(String[] a...

2020-08-13 16:30:21 54

原创 第三课 线程状态

线程状态1 线程状态2 停止线程3 阻塞线程4 线程状态完整版1 线程状态新生状态用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态。处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态(runnable)就绪状态处于就绪状态的线程已经具备了运行条件,但还没有分配到CPU,处于线程就绪队列,等待系统为其分配CPU。等待状态并不是执行状态,当系统选定一个等待执行的Thread对象后,它就会从等待执行状态进入执行状态,系统挑选的动作被称为

2020-08-13 16:26:47 176

原创 第二课 多线程的实现

多线程的实现1 Java中实现多线程(一)2 Java中实现多线程(二)2.1 Thread 和 Runnable 的区别2.2 静态代理设计模式3 Java中实现多线程(三)1 Java中实现多线程(一)在Java中负责多线程的功能的类是java.lang.Thread包可以通过创建Thread的实例来创建新的线程每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体通过调用Thread类的start()方法来启动一个线程/** * 多线程

2020-08-13 15:45:26 78

原创 第一课 基本概念

基本概念1 线程的概念2 线程和进程的区别1 线程的概念程序:Programe,指令集,是一个静态的概念进程:Process,操作系统调度程序,是一个动态的概念进程是程序的一次动态执行过程,占用特定的地址空间每个进程都是独立的,由三部分组成:CPU,Data,Code缺点:内存的浪费,CPU的负担线程:Thread,是进程中的一个“单一连续控制流程”(多条执行路径)线程又被称为轻量级进程(lightweight process)每个线程独立运行一个进程可拥有多个并行的(Conc

2020-08-13 15:37:14 73

原创 第四课 流程控制

流程控制1 流程控制分类2 分支结构2.1 IF函数2.2 CASE结构2.3 IF结构3 循环结构3.1 分类及控制3.2 WHILE 结构(Java中的While结构)3.3 LOOP 结构(Java中的While(true)结构)3.4 REPEAT 结构(Java中的do-while结构)1 流程控制分类顺序结构:程序自上而下依次执行分支结构:程序从两条或多条路径中选择一条执行循环结构:程序在满足一定条件的基础上,重复执行一段代码2 分支结构2.1 IF函数功能:实现简单的双分支

2020-08-13 15:15:33 74

原创 第三课 函数

函数1 函数与存储过程的区别2 函数创建语法3 函数调用语法4 函数的应用5 函数的查看与删除存储过程和函数:一组预先编译好的SQL语句的集合,理解成批处理语句,类似于Java中的方法好处提高代码的重用性简化操作减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率1 函数与存储过程的区别存储过程:可以有0个返回,也可以有多个返回,适合做批量插入或批量更新函数:有且仅有一个返回,适合做处理数据后返回一个值2 函数创建语法CREATE FUNCTION 函数名(参数名

2020-08-13 15:14:45 60

原创 第二课 存储过程

存储过程和函数:一组预先编译好的SQL语句的集合,理解成批处理语句,类似于Java中的方法好处提高代码的重用性简化操作减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率1 存储过程的创建和调用1.1 语法及注意事项语法# 创建存储过程CREATE PROCEDURE 存储过程名(参数列表)BEGIN 存储过程体(一组合法的SQL语句)END# 调用存储过程CALL 存储过程名(实参列表);注意参数列表包含三个部分:参数模式,参数名,参数类型(I.

2020-08-13 15:14:00 87

原创 第一课 变量

变量1 变量的分类2 系统变量3 自定义变量3.1 用户变量3.2 局部变量3.3 用户变量和局部变量对比1 变量的分类系统变量会话变量(作用域:只针对当前的会话(或连接)有效)全局变量(作用域:服务器每次启动将为所有的全局变量赋初值,针对于所有的会话和连接均有效,但是不能跨重启)自定义变量用户变量(作用域:针对于当前会话(连接)有效,等同于会话变量的作用域。)局部变量(作用域:仅仅在定义它的BEGIN和END中有效,且必须放在BEGIN和END语句块中的第一句)2 系统变量

2020-08-12 11:29:04 81

原创 第三课 视图

视图1 基本概念2 视图的创建3 视图的修改4 视图的删除5 视图基本信息的查看6 视图的更新(更新数据)7 视图和表的区别含义:虚拟的表,和普通的表的使用没有区别,具有临时性MySQL5.1版本出现的新特性,是通过表动态生成的数据1 基本概念视图:MySQL从5.0.1版本开始提供视图功能。一种虚拟存在的表,行和列的数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的,只保存SQL逻辑,不保存查询结果应用场景:多个地方用到同样的查询结果该查询结果使用的SQL语句较复杂

2020-08-12 11:28:14 132

原创 第二课 事务的使用

事务的使用1 事务的分类2 事务步骤3 数据库的隔离级别(事务并发问题)3.1 脏读、幻读及不可重复读3.2 数据库事务的隔离性3.3 隔离级别3.4 隔离级别的设置3.5 实际操作3.5.1 脏读3.5.2 不可重复读3.5.3 幻读4 回滚点设置1 事务的分类隐式事务:事务没有明显的开启和结束的标记,比如INSERT,UPDATE,DELETE语句因为系统中存在autocommit常量,默认值为on,表示自动提交默认开启,SHOW VARIABLES LIKE 'autocommit';显式事

2020-08-12 11:27:46 118

原创 第一课 TCL语言简介

TCL语言简介1 事务2 存储引擎3 事务属性(ACID)3.1 原子性(Atomicity)3.2 一致性(Consistency)3.3 隔离性(Isolation)3.4 持久性(Durability)1 事务事务由单独单元的一个或多个SQL语言组成,在这个单元中,每个SQL语句是相互依赖的。而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句执行错误,整个单元回滚,所有受到影响的数据将放回到事务开始以前的状态。反之则执行成功。2 存储引擎概念:在MySQL中的数据用各种不同的

2020-08-12 11:27:10 299

空空如也

空空如也

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

TA关注的人

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