![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
文章平均质量分 83
云乐QAQ
这个作者很懒,什么都没留下…
展开
-
快来快来理一理 JAVA Thead状态分析
Thread理一理可恶,阅读aqs的时候发现对java多线程各种操作不敏感,进度就很憋屈,这里给自己理一下。线程状态初始态就绪态运行态等待态计时等待态阻塞态终止态状态转换初始态:也就是线程刚创建的状态,对应java就是线程还没有start之前的状态,此状态在线程状态转换中存在感较低,只是个入口。就绪态:这就是已经开始执行的线程的初始状态了,在等待cpu时间片轮转到就绪态的线程,那么就会转换到运行态。运行态:字面意思,这就是冲冲冲状态。等待态:也是字面意思,线程等待了,需要被原创 2021-09-30 12:25:19 · 296 阅读 · 1 评论 -
java8 不会就out了(三)使用Optional来代替你的空判断
目标(为什么要学)java 8 新特性,早就听说了,比如在java核心原理一书上面,讲到了安全获取还是缓获取来着,用Optional作为容器来装对象,让程序从我们不受控制的报空,变成受我们控制的null处理。此次的目标是在原有的:听说过 的基础上,明白原理,知晓使用场景,融入自己的代码中。作用(能干啥)jdk文档中的描述是:optional是一个基础容器对象,用来储存可能包含也可能不包含非null值的对象。提供访问容器储存对象的方法: 如果isPresent()方法..原创 2021-09-15 17:20:27 · 1044 阅读 · 3 评论 -
【JAVA武器库】synchronized剖析(原理+锁升级流程)
synchronized原理synchronized是java提供的内置性原子锁。使用了synchronized的代码块,会在编译之后在代码块的前后加上monitorenter和monitorexit字节码指令。由于只用了monitor这个监视器,synchronized也叫监视器锁,而且由于Java中的线程和操作系统原生线程是一一对应的,1.6之前的可以认为对应操作系统的互斥量(mutex,线程被阻塞或者唤醒时时会从用户态切换到内核态,这种转换非常消耗性能。执行monitorentor会将计数器+1原创 2021-09-09 16:40:12 · 167 阅读 · 0 评论 -
java8 不会就out了(二)Stream流详解(使用+原理)
StreamList<String> deviceNames = deviceList .stream() .filter(x->{x.getId()<100}) .map(EnvironmentDeviceDTO::getDeviceName) .di原创 2021-09-09 11:06:23 · 340 阅读 · 0 评论 -
java8 不会就out了(一)lambda表达式详解(怎么用,在哪用,怎么更好的用)
java 8 不会就out了Lambdalambda知识点综述:1.lambda用来减少匿名类的复杂编写。2.lambda表达式用来实现函数式接口,函数式接口是有且只有一个抽象方法的接口,如果有多个抽象方法,或者一个抽象方法都没有,就不是函数式接口。3.编译器可以通过lambda实现的函数式接口推断出参数类型,所以可以省略定义的参数类型。4.lambda表达式对单一方法的调用,可以使用方法引用的方式,也就是 :: 隔开的类名、方法形式。5.jdk8新增的函数式接口可以很方便的支持lambda表原创 2021-09-09 11:02:00 · 226 阅读 · 0 评论 -
SpringCache源码简单研究
最近目标是写一个只需要本地的缓存,并且可以设置过期时间。经过了解呢,spring有自带的缓存springcache,了解了一下发现使用是挺方便的,老早之前整合redis的时候还使用过。但是未能满足业务需求的是,无法设定过期时间。那就准备自己实现一下子呢。了解到,有两个玩意,CacheManager和Cache两个ConcurrentMap,前者用来管理cache的,可以通过name获取cache,后边是保存缓存内容,通过key获取缓存值。而我的需求的过期时间细粒度并不高,相同name空间定时清空就可原创 2021-06-04 17:44:15 · 167 阅读 · 0 评论 -
简述BIO与NIO的概念与区别
BIO阻塞式IO,同一时间只能读或者写。虽然可以通过多线程来满足多通路,但是各个线程自身还是在阻塞的。由于BIO是面向流的,阻塞也就出现在三个地方:accept、InputStream、OutputStream。即:accept等待接受TCP请求,接收时候建一组IO流,交给另外一个线程去处理。thread thread thread | | | | | |...原创 2021-01-12 16:24:59 · 847 阅读 · 0 评论 -
建造者模式和桥接模式,答应我告别ifelse好吗?
建造者模式我理解的就是零件的装配,用在需要把一些有联系的属性拼接起来。如StringBuilder就是很典型的。引入一个场景,去药房抓中药,有以下组成:1、药品 (抽象零件)2、天麻、枸积、何首乌(具体零件)3、Builder组装接口 (抽象组装)4、Builder 组装实现类// 抽象零件public interface Medicine { String getName(); double getPrise(); String getDes..原创 2020-12-08 18:04:07 · 541 阅读 · 1 评论 -
你真的懂工厂模式吗?
https://www.zhihu.com/question/20367734暂时的理解就是抽象工厂模式比工厂模式牛逼,也就是沃尔玛和便利店的关系。原创 2020-12-08 17:05:42 · 114 阅读 · 0 评论 -
记录一下动态代理
静态代理说动态代理之前咱看看静态代理是啥吧,毕竟各个关于动态代理的文章都会提到静态代理。我理解的静态代理就是:比如我有一个类A,然后现在需要给A添加一些操作,但是又不想去修改A本来的代码,那么咱可以写一个A的代理类AProxy,在代理类中注入A的对象,再对A的操作进行维护。听上去还是挺有用的哈,但是如果使用很多很多静态代理的话,系统中的类会非常多,不便于维护。那咋办呢,所以才要有动态代理嘛。动态代理第一次听说这个词呢还是力哥给我讲项目的时候提到的,然后介绍了下在我们项目中应用的.原创 2020-12-07 18:21:50 · 108 阅读 · 0 评论 -
ConcurrentHashMap和HashTable小细节
内容总结于敖丙:https://mp.weixin.qq.com/s/AixdbEiXf3KfE724kg2YIw多线程下能够代替hashmap的有哪些?三种使用Collections.synchonizedMap()去把一个map类型转换成一个安全的map集合(所有操作加互斥锁) 使用hashtable 使用ConcurrentHashMap但由于前两者都是单纯的给所有操作加上锁来保证并发安全,效率并不高。咱一般使用第三种.Collections.synchonizedMap原创 2020-12-02 23:11:50 · 142 阅读 · 1 评论 -
再谈HashMap,面试不迷路!
1. 底层数据结构数组和链表(1.8之后加入红黑书)2.插入链表的方式在使用对象的hashcode和链表长度-1取余之后得到下标,对象放入对应的下标位置。如果该位置已经有值,则形成链表排列。1.7之前插入链表的方式是头插法,但如果在并发情况下可能会造成链表的死循环:比如 原数组的某条链表是 1->2,那么两个线程同时添加3的时候造成扩容,线程t1扩容数据迁移之后,这三个节点恰巧还是在同一个数组位置上,2->1->3。此时t2也开始数据迁移,处理的第一个节点还是刚加入进来原创 2020-11-30 22:17:24 · 208 阅读 · 2 评论 -
volatile关键字致命剖析
volatile关键字语义一个共享变量被volotile关键词修饰之后,就具备了以下两层语义:保证了不同线程对该变量值操作的可见性禁止jvm进行指令重排序语义1的解释:用了volatile修饰的变量值一经修改就会马上写入主存。用了volatile修饰的变量值一经修改,其他线程的工作内存中的缓存值会马上失效。用了volatile修饰的变量值工作内存中的缓存值失效了再使用新值时,会去主存中获取。以此保证可见性。语义2的解释:保证了有序性正所谓天道有缺(hhh),volatil原创 2020-11-24 21:58:19 · 120 阅读 · 1 评论 -
面试官:那接下来我们聊聊接口吧!
接口接口不是类,而是对希望符合这个接口的类的一组需求,也就是说,接口就像一种`规定`。接口中的所有方法都自动是public方法,因此在接口中申明方法时,可以不用加上public字段。(java9之后可以用private,但没啥用,必须实现,只能用于给接口中的其他实现提供辅助)但是要注意的是,接口中,千万不能有实例字段。(java8之后可以实现方法了,但是一直都不能有实列字段)接口的属性可以声明接口的变量,但是接口变量的引用必须是实现了这个接口的类对象。接口可以被拓展,从通用性较高的接口拓展到专原创 2020-10-10 15:08:34 · 157 阅读 · 0 评论 -
注解与反射
之前在读源码的时候由于java的基础知识实在太拉闸,所以暂时放弃源码阅读任务,既然基础差那就学基础呗,所以学了注解和反射机制。首先是注解Annotation注解,顾名思义啊,和注释有点类似,但是注解是给代码看的,不是给人看的,作用是对程序做出解释,可以被其他程序读取(比如用反射来操作注解),内置注解java自带的注解:Deprecated (常用)用于过时的类、方法、成员变量等Override(常用)覆盖父类方法SuppressWarning(常用)阻止警告,用来抑制编译时原创 2020-06-09 17:19:46 · 119 阅读 · 0 评论 -
ssm项目运行流程
这两天开始写ssm项目了,具体的配置在上一个ssm博客写过啦。这里帮自己记录一下ssm项目的运行流程,方便之后复习。比如首先,我们在浏览器上面输入url对应 分类list (admin_category_list)那么这时候 由于咱在web.xml中配置好了把所有的访问全都拦截给DispatcherServlet处理:web.xml:DispatcherServl...原创 2020-03-26 16:15:58 · 7445 阅读 · 4 评论 -
Intellij IDEA 详细安装配置流程
首先在官网去下载Ultimate版本的,这个版本对j2ee支持https://www.jetbrains.com/idea/download/#section=windows安装激活Intellij Idea 新建java项目如果电脑上有旧版本,要删除掉IDEA和其他的IDE有所不同,它刚开始启动都有许多配置需要做第一个选项就导入旧的配置,咱新安装就选第二个...原创 2020-03-24 16:42:50 · 2563 阅读 · 0 评论 -
Log4j日志工具
通常,我们写代码的过程中,免不了要输出各种调试信息。在没有使用任何日志工具之前,都会使用System.out.println来做到。 这么做直观有效,但是有一系列的缺点:1. 不知道这句话是在哪个类,哪个线程里出来的2. 不知道什么时候前后两句输出间隔了多少时间3. 无法关闭调试信息,一旦System.out.println多了之后,到处都是输出,增加定位自己需要信息的难度等等...原创 2020-03-20 14:03:06 · 554 阅读 · 0 评论 -
Spring学习笔记(二)注解方式AOP 注解方式测试
注解方式AOP昨天学到了AOP的配置,以核心业务和周边功能缠绕的形式分开写两部分代码。但是AOP的applicationContext.xml的配置还是挺繁琐的,那么今天就出现了! 用注解的方式写AOP,会简洁很多。使用@Component("s") 注解ProductService 类,昨天的博客上也出现了它,不过是用xml自己配置的,这里直接使用注解方式简化了,它的作用能是模拟核心业务...原创 2020-03-14 12:50:50 · 156 阅读 · 0 评论 -
Spring学习笔记(一) IOC/DI 注入对象 注解方式IOC/DI AOP
首先呢Spring是一个基于IOC和AOP结构的J2ee系统的框架IOC 是反转控制,也是Spring的基础Inversion Of Control, 在之前呢,创建对象都是我们自己new的,然后进行各种配置,现在IOC呢就是把这一步交给Spring来做。DI 依赖注入 Dependency Inject. 简单地说就是拿到的对象的属性,已经被注入好相关值了,直接使用即可。...原创 2020-03-13 15:22:02 · 196 阅读 · 0 评论 -
JAVA 框架 Hibernate (插入、对象状态、获取)
使用JDBC做数据库相关功能开发会做很多重复性的工作,比如创建连接,关闭连接,把字段逐一映射到属性中。 Hibernate把这一切都封装起来了,使得数据库访问变得轻松而简单,代码也更加容易维护。说白了,hibernate是拿来管数据库的。配置首先是导包:站长准备好的,直接导了就完事= =。然后创建一个实体类用来映射数据库中对应的表,比如我数据库创了个表product_,那么...原创 2020-03-12 19:36:59 · 200 阅读 · 0 评论 -
J2EE学习笔记 filter过滤器
概念Filter就像一个一个哨卡,用户的请求需要经过Filter并且可以有多个过滤器例子:用filter来看看用户访问了哪些网页:package filter;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;import javax.servle...原创 2020-02-24 14:05:25 · 223 阅读 · 0 评论 -
java学习笔记 JDBC(二) 事务,DAO,数据库连接池
execute和executeUpdate的区别相同点:都可以执行增删改操作。都有返回值不同点:不同1:execute可以执行查询语句然后通过.getResultSet,把结果集取出来,但是使用起来没有之前学的executeQuery方便。executeUpdate不能执行查询语句不同2:execute返回boolean类型,true表示执行的是查询语句,false表...原创 2019-12-05 16:49:54 · 224 阅读 · 0 评论 -
java学习笔记 JDBC(一) 增删改查,预编译statement
建立与数据库的connection连接:try { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java? characterEncoding=UTF-8"...原创 2019-12-04 16:46:43 · 354 阅读 · 0 评论 -
java学习笔记 多线程(三)线程池、Lock对象、原子访问
线程池每一个线程的启动和结束都是比较耗费时间和资源的,线程池的思想呢就是设定一定的线程数量等待调用,有需要的时候就调用没有需要的时候就等待着。有了线程池的存在,整个程序的运行过程,都不需要创建新的线程,而是循环使用线程池中已经存在的线程。java自带的线程池ThreadPoolExecutor在包java.util.concurrent下面。使用例子(参数说明):pack...原创 2019-12-03 16:33:51 · 115 阅读 · 0 评论 -
java学习笔记 多线程(二)线程同步、死锁、交互
线程同步问题:假设有一个数x=1000,有两个线程,一个给x加一操作、另一个给x减一操作,那么在执行n次之后,讲道理x应该还是等于1000的,但是因为线程同步的问题,最后会出现x!=1000的情况。线程同步问题产生的原因:1. 假设增加线程先进入,得到的x是10002. 进行增加运算3. 正在做增加运算的时候,还没有来得及修改hp的值,减少线程来了4. 减少线程得到的h...原创 2019-12-02 18:42:09 · 282 阅读 · 0 评论 -
java学习笔记 多线程(一)创建多线程,线程常用方法
首先是进程和线程的区别,进程就是像打开csgo.exe就是一个进程,然后打开LOL.exe又是另外一个进程了。而线程呢,就是在同一进程内部,发生的事情。那么就开始了解线程!创建多线程:线程有三种创建方法:1.继承Thread类的方式public class Testthread extends Thread{ public void run(){ ...原创 2019-12-01 18:31:25 · 386 阅读 · 0 评论 -
java学习笔记 lambda、聚合操作
Lambda表达式,就相当于把一个匿名类简写简写再简写,然后呢就是咱看到的简洁的Lambda式子啦。比如有一个简简单单的匿名类 HeroChecker c1 = new HeroChecker() { public boolean test(Hero h) { return (h.hp>100 && h.damage<50); ...原创 2019-11-30 17:33:49 · 430 阅读 · 1 评论 -
java学习笔记 集合框架、linkedlist
Arraylist就像vector一样,不限长度List接口:实现了List接口常用的声明 List heros = new ArrayList();这样用接口引用子类对象 (多态)ArrayList里的方法照常用,而且这样并没有把heros写死,就是可以通过new的不同 动态的调用对象,如后边的linkedlist也实现了List 的接口,就更灵活嘛。泛型:...原创 2019-07-22 14:57:41 · 118 阅读 · 0 评论