# java-demo **Repository Path**: oswl/java-demo ## Basic Information - **Project Name**: java-demo - **Description**: java 基础入门级小项目,完善中。。。 - **Primary Language**: Unknown - **License**: Zlib - **Default Branch**: master - **Homepage**: https://oswl.gitee.io/java-demo - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2020-08-21 - **Last Updated**: 2025-04-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # java-demo ### 介绍 java demo 这是一个Java基础的测试项目 ### 目录结构 demo.io 测试和io相关的一些类 #### 测试的一些用法: ##### io流-bio-阻塞式io - 字节流的使用 - 字符流的使用 - 字节流到字符流的转换 - 桥转换处理编码 - 过滤流的使用 - 文件的输入输出 - 读写字节到文件 - 读写中文到文件 - 读写基础数据类型到文件 - 读写对象类型数据 - 文件拷贝/5种 - 序列化 - 网络编程-服务端和客户端的基本使用 ##### nio 非阻塞式io - nio的基本使用 ##### 多线程笔记 - 线程:一个程序顺序执行流程 - 并发原理:CPU分时间片,交替执行 宏观并行 微观串行 - CPU时间片: OS负责调度 - 数据空间: 堆空间共享, 栈空间独立 两种实现方式: 实现Runnable接口 实现run方法 new Runnable(task) 任务对象 new Thread(任务对象) 继承Thread类 覆盖run方法 Thread.sleep() 限时等待 休眠 Thread.yield() 放弃CPU 回到就绪状态 setDaemon(true) 设置线程为守护线程, 所有的非守护线程都结束时,进程就会结束 t.join(): 当前线程进入等待状态, 直到t线程终止 才会恢复执行 当多线程共同访问同一个对象(临界资源)的时候, 如果破坏了不可分割的操作(原子操作),就可能发生数据不一致 每个Java对象都有一个互斥锁标记,用来分配给线程 synchronized(o){ } 对o加锁的同步代码块,只有拿到o的锁标记的线程,才能进入对o加锁的同步代码块 synchronized 方法修饰符 对this加锁的同步代码块 只有拿到o的锁标记的线程,才能调用o的同步方法 线程通信 等待-通知 o.wait() : 必须出现在对o加锁的同步代码块 线程会释放锁标记,进入等待状态 (进入o的等待队列) o.notify()/notifyAll() :必须出现在对o加锁的同步代码块 从等待状态中释放一个/全部线程 JDK5 ExecutorService 线程池 线程资源共享 Calllable和Future 线程任务可以有返回值, 可以抛异常 Lock 锁对象 tryLock()方法 可以尝试拿到锁,拿不到不会阻塞 Condition 等待队列对象 ReadWriteLock 读写锁 写锁未分配时,读锁可以反复分配 读写分离 ##### 线程安全的类 - CopyOnWriteArrayList 利用复制数组的方式实现数组元素的修改 写效率低 读效率高 (读操作远多于写操作) - CopyOnWriteAraySet - ConcurrentHashMap 分段锁 (1.5) CAS(1.8) - ConcurrentLinkedQueue 线程安全的队列(链表实现) 利用无锁算法实现线程安全 CAS ##### BlockingQueue 阻塞队列 ###### put() 添加元素到队列中 如果队列满,则等待 ###### take() 删除队头元素, 如果队列空,则等待 ###### 实现类: - ArrayBlockingQueue 数组实现 有界队列 put方法可能等待 - LinkedBlockingQueue 链表实现 无界队列 put方法不可能等待 #### 心得,无法通过单一测试得到 ##### 对象序列化 - 对象如果要放在流上进行传输,需要实现Serializable接口 - 反序列化时可以不用调构造方法就完成对象的构建 - 反序列化子对象时,如果子对象实现了Serializable接口,而父对象未实现,父对象有无参构造方法,则子对象反序列化时会调用父对象的无参构造方法构建对象 - 反序列化子对象时,如果子对象实现了Serializable接口,而父对象未实现,父对象没有无参构造方法,则子对象反序列化时会报错 - 自定义序列化后,反序列化时会调用无参构造构建对象 ##### 对象二次序列化-浅克隆和深克隆 ###### 二次序列化 - 指的是一个对象被同时序列化了两次,通过反序列化后得到的对象地址一样的问题 - 测试类: demo.io.TestDoubleSerializable ###### 什么是克隆 - 简单来说,就是复制一个新的对象,各项参数和源对象一致,但是地址不同 - 指一个对象实现了Cloneable接口,并且覆盖实现了Object方法的clone方法,并将其修饰符改为pulic - 实现了Cloneable接口:是为了标识该对象支持克隆 - 覆盖实现了Object方法的clone方法,并将其修饰符改为pulic:Object的clone方法是不支持直接访问的,所以要覆盖才能使用 ###### 什么是浅克隆 - 打个比喻:通过克隆技术,克隆了一个儿子,克隆完成后,两个儿子共用一个父母,就是指浅克隆 - 就是指对象内还有一个对象,该对象实现了序列化接口,并且开启了克隆的方法时,该对象内的对象不会被同时克隆. - 通过反序列化得到的两个对象虽然实现了克隆,但是其内部的对象的地址池还是会保持一致,这种情况称为浅克隆 - 例子:demo.io.TestClone.testShadowClone() ###### 什么是深克隆 - 打个比喻:通过克隆技术,克隆了一个儿子的同时其父母也被克隆,克隆完成后,两个儿子都有自己的父母,就是指深克隆 - 指对象克隆的同时,其内部对象也同时被克隆 - 例子:demo.io.TestClone.testDeepClone() ##### 网络编程 socket通信-基于协议的通信,其实也是io流的一些操作 bio:blocked io 阻塞式io nio:no-blocking io 非阻塞式io aio: ###### 服务端 basedemo:demo.io.BioServer ###### 客户端 basedemo:demo.io.BioClient ##### jdk8性能测试,其它版本自行测试 TestCreateObj java.version=1.8.0 循环10亿次创建对象的时间:8 循环10亿次给同一对象赋值的时间: 19 循环10亿次反射创建对象的时间:1996 ###声明 为方便测试,本项目的异常处理是直接抛出,实际开发过程中是要根据具体场景处理异常的,请注意 本项目javadoc访问地址 ## https://oswl.gitee.io/java-demo