3 dayAndnight2018

尚未进行身份认证

我要认证

个人博客https://dayAndnight2018.github.io/blog github: https:/github.com/dayAndnight2018

等级
TA的排名 1w+

线程安全类的设计原则

《代码大全》就有提过,问题解决得越早,花费的代价就越小。首先考虑该类是否会存在于多线程环境。如果不是,则不考虑线程安全。然后考虑该类是否能设计为不可变对象,或者事实不可变对象。如果是,则不考虑线程安全最后,根据流程来设计线程安全类: 1、找出构成对象状态的所有变量。 2、找出约束状态变量的不变性条件。 3、建立对象状态的并发访问管理策略: a.java监视器模式。 一直使用某一对象的锁来保护某状态。...

2020-09-23 10:34:15

数据存在性查询优化

我们确定数据是否存在的需求很是常见,常常通过以下方式进行判断:SELECT count(*) FROM table WHERE a = 1 AND b = 2这会导致全表扫描。当然,当数据不存在时,全表扫描是必须的,但如果数据存在多条,这种查询方式查询到数据后继续扫描全表,因此可以进行优化。SELECT 1 FROM table WHERE a = 1 AND b = 2 LIMIT 1当我们只需要判断存在性时候,只需要在最后加上limit 1因此,数据查到后直接返回,优化了存在多条

2020-09-17 11:07:08

Spring Boot实战清华版 Web应用开发

静态页面开发在src/main/resources/static下创建index.html这是一个静态页面。访问greeting访问index.html基于Thymeleaf的web应用添加依赖:返回的名称就是视图模板的名称:创建模板src/main/resources/templates:使用${name}读取注入model的参数效果:Thymeleaf知识声明...

2020-09-10 17:50:40

Spring Boot实战清华版 相关注解

Java注解的定义与使用使用@interface定义一个注解:使用注解标记类:元注解给自定义注解(n.)进行注解(v.)的注解(n.)。1. @Retention:指定注解的存在时间。RetentionPolocy.SOURCE 源码级别RetentionPolocy.CLASS 编译级别RetentionPolocy.RUNTIME 运行级别2. @Documented: 被注解的内容提取成文档3.@Trag...

2020-09-10 16:30:05

Spring Boot实战清华版 创建项目

Create New Project创建基于Spring Initilizr的项目。填写项目信息group:组,一般用于区分项目来源artifact: 组内唯一确定项目type: 项目类型Language: 编程语言packaging: 打包方式Java Version: java版本version: 项目版本name: 项目名称description: 描述package: 包选择依赖此处添...

2020-09-10 14:56:58

Spring Boot实战清华版 Spring生态

Spring的各个模块Test:测试Core Container:核心容器(Beans Core Context SpEL)AOP:面向切面编程Aspects:切面Instrumentation:监测Messaging:消息Data Access / Integration: 数据访问与集成(JDBC ORM OXM JMS Transactions)Web:web模块(Websocket Servlet Web Portlet)...

2020-09-10 12:06:54

Java 反射(4)

获取泛型方法返回值类型对于上述的getStringList方法,通过getGenericReturnType获取泛型类型,转为ParameterizedType,然后获取真实的类型getActualTypeArguments获取泛型参数对于上面的泛型参数,通过getGenericParameterTypes获取参数的泛型,然后转ParameteredType再获取真实类型,getActualTypeArguments获取泛型变量...

2020-09-10 11:40:03

Java 反射(3)

特例:获取getter setter方法public static void printGettersSetters(Class aClass){ Method[] methods = aClass.getMethods(); for(Method method : methods){ if(isGetter(method)) System.out.println("getter: " + method); ...

2020-09-09 15:37:10

Java 反射(2)

获取Constructor对象直接获取所有public构造器:Class aClass = ...//获取Class对象Constructor[] constructors = aClass.getConstructors();根据参数类型获取指定的构造器:Class aClass = ...//获取Class对象Constructor constructor = aClass.getConstructor(new Class[]{String.class});...

2020-09-09 14:59:08

Java反射(1)

获取Class对象1. 通过类名获取Class myObjectClass = MyObject.class;2. 通过类的全限定名称获取String className = ... ;//在运行期获取的类名字符串Class class = Class.forName(className);方式二需要注意捕获异常,防止ClassNotFoundException获取类的名称Class aClass = ... //获取Class对象,具体方式可见C...

2020-09-09 14:40:12

Java NIO(3)

Path创建绝对路径//windowsPath path = Paths.get("c:\\data\\myfile.txt");//linuxPath path = Paths.get("/home/jakobjenkov/myfile.txt");创建相对路径Path projects = Paths.get("d:\\data", "projects");Path file = Paths.get("d:\\data", "projects\\a-proje..

2020-09-09 11:43:38

Java NIO(2)

FileChannel连接到文件的通道,可以通过文件通道读写文件。始终是阻塞的,无法实现非阻塞,即不支持Selector获取FileChannel需要通过使用一个InputStream、OutputStream或RandomAccessFile来获取一个FileChannel实例。读取数据创建一个ByteChannel,然后读取数据。写入数据使用write写入Buffer数据。注意flip的使用:关闭通道size获取文件的...

2020-09-09 11:23:34

Java NIO(1)

核心组件ChannelBufferSelectorChannel与Buffer类似于Stream和byte的概念,NIO涉及Channel和BufferSelector允许单线程处理多个channel。将channel注册到Selector中,进行select调用,一旦有数据就会返回,否则阻塞。Channel既可以从通道中读取数据,又可以写数据到通道。可以异步读写。通过Buffer操作。涉及的Channel:File...

2020-09-09 10:30:21

企业级Java微服务2:开发一个简单的Restful微服务

·

2020-09-08 10:35:25

企业级Java微服务1:简介

企业级Java什么是企业级Java?就是为了满足企业开发需求的Java。包括:1. 前端UI2. 后端数据库3. 通过web服务与其他应用交互4. 与内部系统交互最常见的企业级Java框架:JavaEE、Spring传统Java项目架构模型、服务层作为jar包打包,controller、view作为war包打包。进化后的架构:单体架构的缺点1. 单模块扩展不可行。对单个模块无法扩展,需要整个实例扩展。2. 单模块的性能问题...

2020-09-07 20:16:42

JAVA IO

数据读写的媒介IO实际上就是像水流一样读写文件 管道 网络连接 内存缓存 Java标准输入、输出、错误输出读入程序的叫Input,到处媒介的叫Output常见的IO操作类java的io操作类有个特点,字符相关的叫Reader,Writer。字节相关的叫InputStream,OutputStream文件读写java中,对文件的读写可根据字节操作还是字符操作分为FileInputStream、FileOutputStream或者Fi...

2020-09-03 11:12:53

Java多线程与并发05: Executors

使用Executor使用executor可以实现类似与Thread的方法开辟线程:使用execute方法执行一个Runnable接口的实现。但是存在很多限制:1. 无法获取返回值2. 无法知道运行的进度,无法取消任务。3. 无法执行批量的任务。4. 无法终止线程。ExecutorServiceboolean awaitTermination(longtimeout, TimeUnit unit)等待线程完成,当调用shutdown或超时时间到了或被...

2020-08-09 17:32:00

Java多线程与并发04: Thread Additional Capabilities

非捕获异常的处理当线程中抛出异常的时候,一般抛出并打印stacktrace:抛出异常:我们可以自定义未捕获异常处理器:当出现未捕获异常,会按照定义的UncaughtExceptionHandler去处理异常。当然,也可以为其设置默认的未捕获异常处理器,一般设置过未捕获异常处理器后,默认的处理器将被覆盖。ThreadLocal我们有这样的一个场景,需要将一些数据与线程绑定,例如用户id。我们可以使用局部变量,但是维护起来比较麻烦。我们也可以使...

2020-08-08 17:20:35

Java多线程与并发03: Wait & Notification

多线程的协同多个线程之间协同使用共享资源的问题,对资源的读写进行条件控制,使用wait和notify方式控制线程之间的等待和唤醒操作。object类提供的apiwait方法:当前线程等待某个条件的成立,其他线程可以使用notify或notifyall方法唤醒当前线程。wait(long timeout)方法:与上面类似,但是有个超时时间,不会一直waitnotify()随机唤醒一个等待中的线程。notifyAll()唤醒所有,谁抢到锁是谁的。基本使用格式:...

2020-08-07 19:24:21

Java多线程与并发02: Synchronized

多线程存在的问题使用多线程可以提高效率,但是会带来其他问题,例如数据共享时出现的混乱问题。都有哪些问题呢?1. 竞争条件a. 我们考虑这样的代码(check + act)当我们在单线程程序中运行时,没有任何问题。a和b都是局部变量的时候,也都没有问题。(因为每个线程都会保存一份副本)我们考虑这样的情形,a和b是成员变量或者静态成员变量,两个线程都来执行这段代码。假设,线程1执行完判断语句,即将执行赋值语句,好了时间片结束了。这个时候,另一个线程把a的值给改了,当线程.

2020-08-07 16:35:25

查看更多

勋章 我的勋章
  • 签到新秀
    签到新秀
    累计签到获取,不积跬步,无以至千里,继续坚持!
  • 专栏达人
    专栏达人
    授予成功创建个人博客专栏的用户。专栏中添加五篇以上博文即可点亮!撰写博客专栏浓缩技术精华,专栏达人就是你!
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 勤写标兵Lv4
    勤写标兵Lv4
    授予每个自然周发布9篇以上(包括9篇)原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。