Java之线程池
Java之线程池感受线程池的好处需求:查看文档,请求文档,返回“文档处理中,请稍后在试”,服务器异步处理将Word文档转为PDF
代码实现新老实现方式的对比
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667package com.java.example.threadpool;import org.testng.annotations.Test;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * @author jingLv * @date 2020/11/02 */public class ThreadVs { /** * 新的处理方式 */ @Test public void newHandle() { // 开 ...
Java之synchronize锁和lock锁
Java之synchronize锁和lock锁Java中多线程主要两种加锁机制:
Synchronize
显示Lock
Synchronized锁1.1synchronized锁是什么?
synchronized是Java的一个关键字,它能够将代码块(方法)锁起来。使用起来非常简单,只要在代码块(方法)添加关键字synchronized即可实现同步功能。
123public synchronized void test() { ......}
synchronized是一种互斥锁,一次只能允许一个线程进入被锁的代码块
synchronized是一种内置锁/监视器锁,Java中每个对象都有一个内置锁(监视器,也可以理解成锁标记),而synchronized就是使用对象的内置锁(监视器)来将代码块(方法)锁定的!(锁的是对象,但我们同步的是方法/代码块)
1.2synchronize用处是什么?
synchronized保证了线程的原子性。(被保护的代码块是一次被执行的,没有任何线程会同时访问)
synchronized还保证了可见性。(当执行完synchronize ...
Java之ThreadLocal
Java之ThreadLocal什么是ThreadLocal注意:JDK1.8版本
首先看下ThreadLocal在源码中的介绍:
123456789101112/** * This class provides thread-local variables. These variables differ from * their normal counterparts in that each thread that accesses one (via its * {@code get} or {@code set} method) has its own, independently initialized * copy of the variable. {@code ThreadLocal} instances are typically private * static fields in classes that wish to associate state with a thread (e.g., * a user ID or Transaction ID). * * ...
Java之多线程
Java之多线程什么是多线程进程打开Windows任务管理器,可以发现我们在操作系统上运行的程序都是进程:
进程的定义:进程是程序的⼀次执⾏,进程是⼀个程序及其数据在处理机上顺序执⾏时所发⽣的活动,进程是具有独⽴功能的程序在⼀个数据集合上运⾏的过程,它是系统进⾏资源分配和调度的⼀个独⽴单位。
进程是系统进行资源分配和调度的独立单位。每一个进程都要它自己的内存空间和系统资源。
线程进程已经是可以进行资源分配和调度了,为什么还要线程呢?是为了使程序并发执行,系统必须执行以下的一系列操作:
创建进程:系统在创建一个进程时,必须为它分配其所必须的、除处理机以外的所有资源,如内存空间、I/O设备,以及建立相应的PCB(进程控制块:Process Control Block)
PCB中记录了操作系统所需的,用于描述进程的当前情况以及控制进程运行的全部信息。PCB的作用是使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位,一个能与其他进程并发执行的进程。或者说,OS是根据PCB来对并发执行的进程进行控制和管理的。
多道程序设计技术是在计算机内存中同时存放几道相互独立 ...
Java之Lombok使用
Java之Lombok使用LombokProject Lombok是一个java库,可以自动插入编辑器构建工具,为您的Java增添色彩。
永远不要再写另一个getter或equals方法,使用一个注释,您的类具有一个功能齐全的构建器,自动化您的日志记录变量等等。
–Lombok官网
Lombok实现原理注解的两种解析方式:
运行时解析
例如Spring AOP切面,这些注解都是在程序运行的时候,通过反射来获取注解值
缺点:只有在程序运行的时候才能获取到注解值,导致运行时的代码效率很低,并且如果想在编译阶段利用注解进行检查就无能为力了
编译时解析
lombok使用的是编译时解析
编译时解析的两种机制
Annot ...
Maven项目管理工具
MavenMaven简介什么是 Maven?Maven 是一个项目管理的工具。Maven 为我们开发人员提供了构建一个完整的生命周期的框架。Maven 使用标准的目录结构和默认构建生命周期,我们可以使用它自动完成项目的基础工具建设。
包含一个项目对象模型(Project Object Model)
一组标准集合
一个项目生命周期(Project Lifecycle)
一个依赖管理系统(Dependency Management System)
用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑
Maven 是干什么的?它是 Apache 的开源项目,主要做 Java 平台的三类事情:项目构建、依赖管理以及项目信息管理,可以防止我们做一些重复的事情。
举个例子:假如有两个项目,需要引入相同的 jar,我们在两个地方都引入,那就是做了重复的事情,我们可以在一个公共的地方引入一次 jar 即可,例如父 pom.xml 中或者公共的 jar 中。
Maven除了具备Ant的功能外,还增加了以下主要功能:
使用Project Object Model来对软 ...
Java之对象的O
为什么会出现这些O?我们知道,这些O不管叫什么名字,其本质都还是对象(Object),既然本质都一样,为什么非要给他们套上各种马甲?
大神认为原因有三:
第一,随着编程工业化的发展,需要有一套合理的体系出现。中国人喜欢造神,外国人喜欢造概念,于是 MVC、MVP、MVVM 等编程模型就出现了,为了搭配这些编程模型的使用,需要对 Object 的功能进行划分,于是我们便看到了这些层出不穷的 Object。当然这里并没有批评这些概念的意思。
其二,我认为在团队协作编码中,一个好的命名方式是可以节约很多时间成本的。就比如getItemById一眼看去就知道是通过 id 获取一个 item 对象,ItemVO一眼看去就知道是前端透出的 json 对应的对象。
其三,如此划分,可以让项目结构更加清楚,不至于出现东一块西一块,对象乱扔的局面。尽可能避免了在多人协作时对象混乱的情况。总的来说,这一切都是为了让软件编程更加合理、更加规范、更加高效。
有哪些O?这些O有很多衍生出的命名,比如VO、DO、BO,这里我们把常见的O列举出来,然后一一解释。
DO( Data Object):与数据库表结 ...
Java之流编程
Java之流编程实战:集合与流操作对比分别使用集合操作及Stream流操作,完成对实际应用场景中的数据处理。直观感受流操作带来的便捷性。
购物车案例沿用Java之函数编程中的购物车的案例。
需求条件:
想看看购物车中都有什么商品
图书类商品都给买
其余的商品中买两件最贵的
只需要两件商品的名称和总价
传统方式处理业务逻辑123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354/** * 以原始集合操作实现需求 */ public static void oldCartHandle() { List<Sku> cartSKuList = CartService.getCartSKuList(); //1. 打印所有商品 for (Sku sku : cartSKuList) { System.out.println(JSON.toJSONString(sku, true)); ...
Java之工具集
Java之工具集Google Guava工具集简介 Guava工程包含了若干被Google的Java项目广泛依赖的核心库,例如:集合、缓存、原生类型支持、并发库、通用注解、字符串处理、I/O等等。
所有这些工具每天都在被Google的工程师应用在产品服务中。
使用和避免null大多数情况下,使用null表明的是某种缺失情况。
Guava引入Optional<T>表明可能为null的T类型引用。Optional实例可能包含非null的引用(引用存在),也可能什么也不包括(引用缺失)。
正是收到Guava的启发,Java8将Optional类作为一个新特性引入进Java8 的类库。
Optional的存在就是为了防止使用对象的过程中出现空值的情况,它是一种强制让我们关注空值处理的一种机制。
实战案例:Java8新特性Optional如何使用1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606 ...
IO流的总结
字节流
字节输入流InputStream
读数据
int read():一次读取一个字节
int read(byte[] bys):一次读取一个字节数组
FileInputStream
BufferedInputStream
字节输出流OutputStream
写数据
void write(int by):一次写一个字节
void write(byte[] bys, int index, int len):一次写一个字节数组的一部分
FileOutputStream
BufferedOutputStream
小结:字节流可以复制任意文件数据,有四种方式一般采用字节缓冲流一次读写一个字节数组的方式
字符流
字符输入流Reader
读数据:
int read():一次读取一个字符
int read(int[] chs):一次读取一个字符数组
InputStreamReader
FileReader
BufferedReader
String readLine():一次读取一个字符串
字符输出流Writer
写数据
void write(int ch): ...