自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(18)
  • 资源 (2)
  • 收藏
  • 关注

原创 13_CompletableFuture异步回调

CompletableFuture异步回调1、简介2、Future 与 CompletableFuture3、代码1、简介CompletableFuture 在 Java 里面被用于异步编程,异步通常意味着非阻塞,可以使得我们的任务单独运行在与主线程分离的其他线程中,并且通过回调可以在主线程中得到异步任务的执行状态,是否完成,和是否异常等信息。CompletableFuture 实现了 Future, CompletionStage 接口,Future接口就可以兼容现在有线程池框架,Complet

2021-09-22 21:18:45 240

原创 12_分支合并框架 Fork/Join

这里写目录标题1、简介2、Fork/join 方法的实现原理3、异常处理4、入门案例1、简介Fork/Join 它可以将一个大的任务拆分成多个子任务进行并行处理,最后将子任务结果合并成最后的计算结果,并进行输出。Fork/Join 框架要完成两件事情:Fork:把一个复杂任务进行分拆,大事化小Join:把分拆任务的结果进行合并任务分割:首先 Fork/Join 框架需要把大的任务分割成足够小的子任务,如果子任务比较大的话还要对子任务进行继续分割执行任务并合并结果:分割的子任务分别放到双

2021-09-22 17:10:18 129

原创 11_线程池

线程池1、线程池概述2、架构3、使用方式3.1、一池N线程3.2、一池一线程(一个任务一个任务执行)3.3、可扩容线程池(线程池根据需求创建线程)4、底层原理、七个参数、拒绝策略6、工作流程7、自定义线程池1、线程池概述由于线程的创建和回收这两个过程是非常消耗性能的,利用池化思想,事先创建好一些线程放入线程池中,使用完之后线程池再回收线程,达到减小资源开销的目的。主要特点:降低资源消耗: 通过重复利用已创建的线程降低线程创建和销毁造成的销耗。提高响应速度: 当任务到达时,任务可以不需要等待线程

2021-09-22 16:14:03 228

原创 10_阻塞队列

BlockingQueue阻塞队列1、概述2、架构3、分类4、核心方法5、总结1、概述当队列是空的,从队列中获取元素的操作将会被阻塞。当队列是满的,向队列中添加元素的操作将会被阻塞。试图从空的队列中获取元素的线程将会被阻塞,直到其他线程往空的队列插入新的元素试图向已满的队列中添加新元素的线程将会被阻塞,直到其他线程从队列中移除一个或多个元素或者完全清空,使队列变得空闲起来并后续新增2、架构3、分类ArrayBlockingQueue: 由数组结构组成的有界阻塞队列。LinkedBl

2021-09-22 14:32:04 182

原创 9_读写锁

读写锁1、概念2、代码3、锁降级1、概念JAVA 的并发包提供了读写锁 ReentrantReadWriteLock它表示两个锁,一个是读操作相关的锁,称为共享锁;一个是写相关的锁,称为排他锁读锁:针对同一份数据,多个读操作可以同时进行而不会互相影响。写锁:当前操作没有完成之前,它会阻断其他写锁和读锁。线程进入读锁的前提条件:没有其他线程的写锁没有写请求, 或者有写请求,但调用线程和持有锁的线程是同一个(可重入锁)。线程进入写锁的前提条件:没有其他线程的读锁没有其他线程的写锁

2021-09-20 18:19:34 112

原创 8_JUC三大辅助类

JUC三大辅助类1、CountDownLatch: 减少计数2、CyclicBarrier: 循环栅栏3、Semaphore: 信号灯总结一句:在并发过程中,到达(减少至或者增加至)或者维持某个条件的前提下,执行相关操作。1、CountDownLatch: 减少计数CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞)计数器的值变为0时,因await方法阻塞的线程

2021-09-20 00:31:29 109

原创 7_Callable&Future接口

Callable&Future接口1、简介2、代码3、总结1、简介Runnable和Callable区别Runnable无返回值,Callable可以使线程返回结果。run()不会发生异常,call()方法可以引发异常Callable不能直接替换 Runnable,因为 Thread 类的构造方法根本没有 CallableFuture 接口//用于停止任务:如果尚未启动,它将停止任务。如果已启动,则仅 mayInterrupt 为 true 时才会中断任务。public

2021-09-18 16:56:31 174

原创 6_多线程锁

多线程锁1、8锁问题2、公平锁和非公平锁3、可重入锁(递归锁)4、死锁4.1、代码4.2、验证1、8锁问题class Phone { public synchronized void sendSMS() throws Exception { //停留 4 秒 TimeUnit.SECONDS.sleep(4); System.out.println("------sendSMS"); } public synchronized vo

2021-09-16 19:03:27 101

原创 5_集合的线程安全

集合的线程安全1、ArrayList1.1、线程不安全演示1.2、解决方案-Vector1.3、解决方案-Collections1.4、解决方案-CopyOnWriteArrayList2、HashSet2.1、线程不安全演示2.2、解决方案CopyOnWriteArraySet3、HashMap3.1、线程不安全演示3.2、解决方案ConcurrentHashMap1、ArrayList1.1、线程不安全演示public class NotSafeDemo { //多个线程同时对集合进行修改

2021-09-16 15:03:44 262

原创 4_线程间定制化通信

场景: A 线程打印 5 次 A,B 线程打印 10 次 B,C 线程打印 15 次 C,按照此顺序循环 10 轮解决:给每个线程定义一个标志位,通过标志位完成定制化通信编码流程上锁   判断条件(防止虚假唤醒),若不满足,conditionA.await();   //具体的逻辑   修改标志位   通过 Condition 唤醒指定线程解锁(finally)class DemoClass{ //通信对象:0--打印 A 1---打印 B 2----打印 C priva

2021-09-16 11:10:43 135

原创 3_线程间通信

线程间通信1、虚假唤醒问题1.1、错误代码1.2、现象1.3、原因分析1.4、解决2、Synchronized实现3、Lock实现场景:有多个线程,实现对一个初始值为0的变量进行操作,实现如下效果(不要求ABCD的顺序)A 1   B 0  C 1  D 0A 1   B 0  C 1  D 0A 1   B 0  C 1  D 01、虚假唤醒问题1.1、错误代码//第一步:创建资源类,定义属性和操作方法class Share{ //初始值 private int

2021-09-16 09:55:21 173

原创 2_Synchronized和Lock

Synchronized和Lock1、多线程编程步骤2、Synchronized2.1、Synchronized作用范围2.2、Synchronized实现卖票例子3、Lock3.1、Lock简介3.2、Lock卖票4、Lock和Synchronized对比1、多线程编程步骤创建资源类,在资源类中创建属性和方法在资源类操作方法判断干活通知创建多个线程,调用资源类的操作方法防止虚假唤醒问题2、Synchronized2.1、Synchronized作用范围修饰一个代码块,被修

2021-09-15 15:59:22 243

原创 1_JUC概述

JUC概述1、什么是JUC2、线程和进程概念2.1、进程与线程2.2、JAVA线程的状态2.3、wait和sleep2.4、并发和并行2.5、管程2.6、用户线程和守护线程1、什么是JUCJUC是java.util .concurrent 工具包的简称,这是一个处理线程的工具包,可以实现多线程高并发的内容2、线程和进程概念2.1、进程与线程进程(Process):指在系统中正在运行的一个应用程序;程序一旦运行就是进程;进程——资源分配的最小单位。线程(Thread):系统分配处理器时间资源的基

2021-09-15 11:24:51 265

原创 17_3_垃圾回收器_日志分析和垃圾回收器的发展

GC日志分析1、常用参数详解2、GC 日志补充说明3、常用日志分析工具4、垃圾回收器的发展1、常用参数详解通过阅读GC日志,我们可以了解Java虚拟机内存分配与回收策略。内存分配与垃圾回收的参数列表-XX:+PrintGC :输出GC日志。类似:-verbose:gc-XX:+PrintGCDetails :输出GC的详细日志-XX:+PrintGCTimestamps :输出GC的时间戳(以基准时间的形式)-XX:+PrintGCDatestamps :输出GC的时间戳(以日期的形式,如2

2021-09-10 13:27:24 162

原创 17_2_垃圾收集器_简介G1回收器:区域化分代式

简介G1回收器1、什么是G1垃圾收集器2、为什么名字叫Garbage First呢?3、G1垃圾收集器的优点、缺点4、参数设置5、G1调优操作步骤6、分区 Region(掌握)7、记忆集与写屏障(一个对象被不同区域引用的问题)8、G1回收过程8.1、年轻代8.2、并发标记过程8.3、混合回收8.4、FUll GC9、优化建议1、什么是G1垃圾收集器G1是区域化的分代式垃圾收集器,为需要低GC延迟,并具有大堆的应用程序提供解决方案。G1主要是面向服务端应用,针对配备多核CPU及大容量内存的机器,以极高

2021-09-10 09:49:46 460

原创 17_1_垃圾回收器_GC分类与性能指标、概述、Serial、ParNew、Parallel、CMS、面试

垃圾回收器1、GC分类与性能指标1.1、GC分类1.2、评估GC的性能指标2、不同的垃圾回收器概述2.1、垃圾回收器的发展2.2、7款经典的垃圾收集器及其与垃圾分代的关系2.3、垃圾收集器的组合关系2.4、查看默认的垃圾回收器3、Serial、SerialOld 回收器:串行回收(了解)4、ParNew回收器:并行回收(了解)5、Parallel、ParallelOld:吞吐量优先6、CMS回收器:低延迟 1、GC分类与性能指标1.1、GC分类按线程数分(垃圾回收线程数),可以分为串行垃圾回收器和

2021-09-08 14:29:46 938

原创 MyBatis if test 判断字符串相等不生效

1、问题采用 MyBatis 框架操作 MySQL 数据库时,判断传入的字符串 prmCreated 值为"N"时,执行相关操作,如下 xml 语句未生效:<if test="prmCreated == 'N'"> and prm_closed = 0</if>2、原因MyBatis 是使用 OGNL 表达式来进行解析的,在 OGNL 表达式中,'N’会被解析成字符。因为 java 是强类型的,char 和 String 不等,所以 if 标签中的 SQL 不会

2021-09-06 14:47:42 2073

原创 16_垃圾回收相关概念

垃圾回收相关概念1、System.gc()的理解2、内存溢出与内存泄漏3、Stop The World4、垃圾回收的并行与并发5、安全点和安全区域6、引用6.1、强引用:不回收6.2、软引用:内存不足即回收6.3、弱引用:发现即回收6.4、虚引用:对象回收跟踪6.5、终结器引用1、System.gc()的理解在默认情况下,通过System.gc() 或者Runtime.getRuntime().gc() 的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。然

2021-09-06 11:25:27 408

多文件上传

支持显示文件名、进度条、上传速度、剩余时间(要看到此效果,文件最好大一些)

2017-03-02

javaweb实现分页代码

分页代码 action接受参数负责调用service,service调用dao查询具体的分页数据,同时将返回的数据封装到PageBean中,再返回action以PageBean。适合初学者参考。注:还包含类似动态显示条(sql数据加到十几页可以看到)

2017-03-01

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

TA关注的人

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