JavaEE
文章平均质量分 62
JavaEE
脑子要敲烂了
这个作者很懒,什么都没留下…
展开
-
HttpServlet-HttpServletRequest-HttpServletResponse
本文介绍servlet API的详细情况(HttpServlet、HttpServletRequest、HttpServletResponse)原创 2024-04-20 10:45:55 · 983 阅读 · 0 评论 -
http服务器——Tomcat使用——如何发布网站
Tomcat是java中最流行的http服务器Tomcat就相当于是网站的“底座”,所写的网站要架到这个底座上,其他用户才能顺利访问(java中)原创 2024-04-09 16:32:16 · 1159 阅读 · 0 评论 -
IO文件基本操作案例
实现对普通文件的复制。原创 2024-04-01 19:26:10 · 77 阅读 · 0 评论 -
文件IO基础知识
文件基础知识,包括文件、硬盘、目录、文件类型、文件的操作分类、文件分隔符、构造文件、文件相关方法、输入/输出原创 2024-04-01 16:13:20 · 337 阅读 · 0 评论 -
文件流对象(字节流、字符流)(InputStream、OutputStream、Reader、Writer)
close()释放文件描述符,文件描述符是一个顺序表(数组),一个进程每次打开一个文件,旧就需要在表里分配一个元素,如果一直打开文件不关闭,会把数组占满,再尝试打开文件时会出错。但如果写入缓冲区后没来得及写入硬盘进程结束了,那么数据会丢失,为了避免这种情况,手动使用flush方法(刷新缓冲区),手动刷新缓冲区,确保数据写入硬盘。每次读写最小单位是“字符”(utf8中1中文字符3字节 GBK中1中文字符2字节)(字符流相当于对字节流的封装 自动把文件中相邻的几个字节转换成一个字符)2.字符流(对应文本文件)原创 2024-04-01 16:10:47 · 425 阅读 · 0 评论 -
多线程进阶知识补充( 信号量Semaphore、CountDownLatch、数据结构中的线程安全问题、ConcurrentHashMap)
信号量Semaphore、CountDownLatch、数据结构中的线程安全问题、ConcurrentHashMap原创 2024-04-01 13:10:37 · 801 阅读 · 0 评论 -
ReentrantLock锁
但是ReentrantLock使用更复杂,尤其容易忘记解锁,加锁时还是首选synchronized(背后有一系列优化手段)③提供了更强大的等待通知机制,搭配Condition类实现等待通知。可重入锁,使用效果上和synchronized类似。①加锁时有两种方式lock,tryLock。②提供了公平锁的实现(默认情况下是非公平锁。原创 2024-03-31 16:24:11 · 170 阅读 · 0 评论 -
callable接口创建线程
为了使线程终止时返回一个结果,java中提供了callable接口。②实现Runnable接口 重写run。③实现Callable接口 重写run。⑤ThreadFactory线程工厂。①继承Thread重写run。④使用lambda表达式。原创 2024-03-31 16:08:50 · 112 阅读 · 0 评论 -
synchronized三个重要机制(锁升级/偏向锁、锁消除、锁粗化)
synchronized的几个重要机制①锁升级(偏向锁)②锁消除③锁粗化。原创 2024-03-31 15:27:55 · 225 阅读 · 0 评论 -
多线程CAS以及ABA问题
面试中比较容易考到CAS问题 并且一旦考到,一定会涉及ABA问题。原创 2024-03-31 15:00:42 · 149 阅读 · 0 评论 -
常见锁策略(乐观悲观锁、重量轻量锁、自旋挂起等待锁、读写锁、可重入不可重入锁、公平非公平锁)
多线程进阶(面试高频)原创 2024-03-31 14:04:53 · 242 阅读 · 1 评论 -
线程池(内置线程池ThreadPoolExecutor、自定义线程池)
此时构造出的线程池对象中的线程数目能动态适应,随着往线程池中添加任务,线程池中的线程会根据需要自动创建出来,创建出来之后也不会着急销毁,会在池子里保留一定时间以备随时再使用。线程为cpu密集型时,线程池中线程数目应不超过N,如果比N更大,也无法提高效率了(cpu吃满了),反而会增加调度的开销。在使用第一个线程的时候,把2 3 4...个线程创建好,要使用的时候不必创建了,直接使用(降低了线程创建的开销)⑦handler线程池的拒绝策略,当线程池中数量已经满了,再添加线程时,不同的拒绝策略产生不同效果。原创 2024-03-31 11:55:56 · 968 阅读 · 1 评论 -
线程定时器Timer-->自己设计定时器MyTimer
主线程执行schedule方法的时候,其实就是把这个任务放到timer对象中了。仔细观察发现整个进程其实没有结束,就是因为Timer内部的线程阻止了进程结束。2.需要有一个数据结构,把所有的任务保存起来—>优先级队列(时间小的先执行)timer中包含一个扫描线程,一旦时间到了,便会执行刚才安排的任务。3.还需要有一个类,通过类的对象描述一个任务(任务内容+时间)1.Timer中需要有一个线程,扫描任务是否到达时间。使用阻塞版本优先级队列则不好处理。约定一定时间后,执行一段代码。原创 2024-03-31 09:48:40 · 184 阅读 · 1 评论 -
阻塞队列——生产者消费者模型
后续的代码中,有的要进行读(判定),有的要进行写(修改),为了避免内存可见性问题,加上volatile。所以,加一个判断条件,wait唤醒后再确认一次队列满不满,如果队列还是满的,继续wait)a.如果队列为空,继续出队列,就会发生阻塞,阻塞到其他线程往队列里添加元素为止。b.如果队列为满,继续入队列,也会发生阻塞,阻塞到其他线程从队列里取走元素为止。如果代码这样写,出现异常后方法不会结束,会继续往下执行,会出现bug。而采用这种方法,出现异常后,方法会结束,不会出现bug。一个普通队列+线程安全+阻塞。原创 2024-03-25 19:33:52 · 401 阅读 · 1 评论 -
单例模式(饿汉模式、懒汉模式、指令重排序)
而如果此时t2开始执行了,判断instance==null不成立,直接return instance,进一步t2线程的代码就可能会访问instance的属性和方法了。假如按照①③②,当t1执行完①③后,instance已经是一个非空的对象了,但是此时指向的是一个没有初始化的非法对象。实际上加锁是一个开销很大的操作,可能会涉及锁冲突,一冲突就会涉及到阻塞等待。如果对象已经有了,线程就安全了,此时可以不加锁了。如果对象还没有,存在线程不安全的风险,就需要加锁。懒汉模式中,又读又写对象,会有线程安全问题。原创 2024-03-25 18:11:09 · 440 阅读 · 1 评论 -
wait和notify等待和释放——控制多个线程执行顺序
②调用notify 或者 notifyAll 方法后,等待线程依旧不会从 wait 返回,需要调用 noitfy 的线程释放锁之后,等待线程才有机会从 wait 返回;①调用 wait 方法后,释放持有的对象锁,线程状态有 Running 变为 Waiting,并将当前线程放置到对象的 等待队列;wait只能由持有相应对象监视器锁的线程调用 也就是说加锁的对象(object1)要与调用wait的对象式=是同一个。wait是等的状态,是阻塞的,啥都不做,不会占据cpu。wait等待,让指定线程进入阻塞状态。原创 2024-03-25 15:37:15 · 470 阅读 · 1 评论 -
volatile关键字——解决内存可见性问题
(之前两个线程同时修改一个变量会有线程安全问题 此时针对同一个变量 一个线程读 一个线程写也会有线程安全问题)这是因为,加入sleep之后,while循环速度慢了,load次数少了,开销少了,编译器也没必要进行优化了编译器什么时候优化并不知道 我们直接通过volatile告诉编译器不要优化)计算机要访问的数据在内存中,cpu使用这个变量的时候,会把内存中的数据读出来,放在寄存器中,再参与运算(load)为了解决上述问题,提高效率,编译器把原来要读内存的操作,优化 成读寄存器,减少读内存的次数。原创 2024-03-25 13:51:49 · 242 阅读 · 1 评论 -
进程&线程&多线程(详解)
进程中包含线程 =>一个进程由多个 PCB 共同表示 =>每个 PCB 就用来表示一个线程 =>每个线程都有自己的 状态,上下文,优先级,记账信息 =>每个线程都可以独立的去 CPU 上调度执行 =>这些 PCB 共用了同样的内存指针和文件描述符表 =>创建线程(PCB) 不需要重新申请资源 =>创建/销毁效率都更高了。进程从cpu离开之前,需要保存现场,把当前cpu中各种寄存器的状态,都记录在内存中,下次进程回到cpu上执行时,会沿着上次执行的位置继续执行(存档 读档)线程没了,Thread对象还在。原创 2024-03-24 21:19:50 · 697 阅读 · 1 评论 -
synchronized加锁——解决线程安全问题
通过加锁,就能解决上文问题。原创 2024-03-24 20:18:11 · 516 阅读 · 1 评论 -
什么是线程安全?线程安全问题形成的原因
整个多线程中最最重要、最最复杂的部分什么是线程安全问题?有些代码在单线程环境下执行,完全正确让多个线程同时执行,此时就可能会出现bug// 对 count 变量进行自增 5w 次i < 50000;});// 对 count 变量进行自增 5w 次i < 50000;});t1.start();t2.start();原创 2024-03-24 20:13:56 · 239 阅读 · 1 评论 -
计算机是如何运行的
(如:加法指令、写入内存指令、跳转指令、函数调用指令)2.对上要给软件提供稳定的运行环境。一个操作系统=内核+配套的应用程序。(有很多指标 最最关注这两个)(内核是操作系统最核心的功能)cpu上能够执行的最小单元。1.对下管理所有的硬件设备。原创 2024-03-24 11:41:49 · 315 阅读 · 1 评论 -
低耦合高内聚
(但在公司日常开发中,不一定能实现,进度紧张,顾不了那么多):各模块之间关联程度小,修改其中一个模块时其他模块改动少。:把相同/相关联的功能放在一起 方便改动。所以写代码的时候追求。原创 2024-03-11 13:32:12 · 361 阅读 · 2 评论