装饰流

DataInputStream

对象流

对象按整体进行读写

对象序列化

随机访问流

RandomAccessFile

随机流可以用于多线程下载或多个线程同时写数据到文件,为快速完成访问提供了便利。

编程:多线程拷贝一个10M的文件

NIO

Channel通道

通道和流的区别

  • 通道可读可写,多功能,流一般来说是单向的。
  • 通到可以异步读写
  • 通道总是基于缓冲区Buffer来读写

可以从通道中读取数据,写入到buffer,也可以从buffer内读取数据,写入到通道中。

Path类

表示的是路径,可以指文件,或目录。只能表示路径,不能指代具体的文件。
与File功能有点类似,

1
Path p=Paths.get("路径");

Files类型

工具集,与Path配置,封装了对文件和目录的常用操作。

Buffer

Buffer用于和Channel交互
四个步骤

  1. 把数据读入buffer

写入buffer,put
flip()模式切换,
读取buffer,get

操作文件

FileChannel

异步文件操作

问题描述:鼠标指针乱窜

今天我把鼠标从书包里拿出来之后,我发现鼠标好像坏了,鼠标移动的时候,指针乱窜。

原因:鼠标的透镜脏了

我把鼠标翻过来,发现光电透镜上有灰尘。

解决方案:擦掉光电透镜上的灰尘

用纸巾擦掉灰尘之后,鼠标就可以正常使用了。

ReentrantLock重入锁

  • ReentrantLock是JDK方法,需要手动声明上锁和释放锁
  • ReentrantLock可设置内部 Condition,实现线程交互
  • Renentrantlock能实现公平锁(默认非公平)
  • lock(), tryLock()加锁
  • unlock()解锁
  • newCondition()获得condition对象。
1
ReentrantLock lock = new ReentrantLock(true);

lock(),抢不到,则等待
tryLock(),抢不到,不等待,

Callable接口

  • 创建线程的方法:
    • 1.通过自定义Thread子类
    • 2.通过使用Runnable接口
    • run方法无法返回值

特点:

  • 对于Callable,需要实现call()方法

  • 支持泛型返回值

  • 可以抛出异常

  • 需要解决的问题

      1. 如何将返回值存储到主线程变量中
      1. Callable接口并不能直接创建线程,只有Runnable接口可以,怎么办?

解决方法:借助Future接口接受线程返回值,其具体实现类FutureTask实现了Runnable接口,可以作为ThreadTarget

Future

Callable线程编程基本步骤

1.创建线程体类,实现Callable接口,重写Ca(()方法。

1
class Thread Target implements Callable{}

2.基于Callable对象,创建FutureTask对象

1
2
ThreadTarget target = new ThreadTarget()
Future Task task = new Future Task(target);

3.基于FutureTask对象,创建线程对象,并启动

1
2
Thread thread = new Thread(task);
thread.start()

4.调用FutureTask,获取线程状态及返回值。(异步)

1
Object result= task.get()

Future接口主要方法

get()阻塞式,用于获取cabe行完后的返回值
get(long timeout, TimeUnit unit): get()的重载方法用于最多等待的时间后,如仍未返回则线程将继续执行。
cancel():撤销正在执行CallaleTask
isDone():是否执行完毕
isCancelled():任务是否已经被取消。

Java线程池

Executor架构

image-20210815101724705

image-20210815102136570

ThreadPoolExecutor类

多线程

操作系统

并行计算

并发

进程与线程

实现线程

方式1:继承Thread

方式2:实现Runable接口

线程状态及转换

线程调度

线程让步

线程同步

JVM内置锁机制

同步代码块

1
2
3
synchronized (锁对象) {
同步代码
}

Object里面有锁标志位,当锁标志位为1的时候,表示被占用,当锁为0时时,表示可用。

同步方法

锁就是this对象

生产者 消费者

锁对象的wait和notify

Java并发编程常识

系统内存

三大特性

原子性

通用场景OcR

Volatile变量

满足可见性,不满足原子性。

AotimeXxxx类

CAS机制

悲观锁

乐观锁

CAS

CAS原理

具体实现:AotimeXxxx类

Threadlocal类型

在内存里面属于共享的变量,但是在线程里则不是

做数据隔离的,线程访问Threadlocal变量的时候,使用的是线程缓存的副本。

晚上安排
做线程习题

Mybatis要点

#{}${}

#{}表示占位符
${}表示先拼接,直接进行字符串替换。

parameterType和resultType

mysql自增返回

Mysql UUID

自定义别名

传po对象

resultType总结

输出HashMap

问:Mybatis有哪些标签

动态SQL

if

where

传递list

传递array

不好用,不要用,写在业务层里面的。

sql标签,include

分页显示

方式1:查询全部,发送前端,然后使用JS分段显示。

缺点,传输慢,占内存

方式2:每次发送请求,读取数据库。

select * from student limit 开始坐标,条目数
查询十条:
第一次查询:
select * from student limit 0,10
第2次查询
select * from student limit 10,10
第3次查询:
select * from student limit 20,10

select * from student limit (page-1)*10,size

(page-1)*10,size

一次性读取到后端,逐段返回给后端。

VO类
PageInfo{
page—-当前页
size—-一页要显示的条数
total—总的记录数
pages—总页数
uuid—-缓存—>Map(key(uuid),List)
rows—-List
}

查询请求的时候,先查看uuid有没有,如果没有的话就查询数据库,如果已经有了的话就直接返回缓存中的分页数据。

二级缓存,自己实现,缓存长久不用占用内存怎么办,加入一个线程,如果发现一个缓存长时间不被使用,就删除掉该缓存。

自动生成主键

计算机网络

传输层

不允许异地登录

得到用户和密码之后,

不允许多地登录

Spring MVC要点

restful风格

老师个人理解:请求参数放在路径里面,这样传递参数的时候就不需要在URL后面添加?key1=value1&key2=value2

拦截器

用法:权限判定,登录检查。

明天
线程,IO流,网络编程

文件上传

上传到服务器,写到服务器的磁盘,不再本地。

HTTP协议不能做到断电续传,一般情况下不允许上传大图片。

文件上传
文件下载

  • 直接下载
  • 输出到响应流

JQuery文件上传

计算机网络 传输层

IP网络:主机到主机之间的通信
端口:程序到程序之间的通信。

端口是干什么用的

UDP应用

视频会议。
IP电话

脏包

TCP如何做到可靠传输

累加确认
超时重传

流量控制,拥塞控制是什么

三次握手,四次挥手。

三次握手

image-20210813161842429

DOS攻击

UDP没有拒绝服务攻击。

应用层

DNS
输入网址到首页出现经过的步骤

安全

截获
中断
篡改
伪造

image-20210813162515791