- 博客(48)
- 收藏
- 关注
原创 private方法可以被代理吗?
目录抽象类不可以被代理 没有接口不可以被代理接口的静态方法能被重写或实现吗?defaultMethod可以被代理吗?privateMethod可以被代理吗?protected 、package下面方法可以被代理吗抽象类不可以被代理 没有接口不可以被代理在 Java 8之前,接口可以有常量变量和抽象方法。我们不能在接口中提供方法实现。如果我们要提供抽象方法和非抽象方法(方法与实现)的组合,那么我们就得使用抽象类。 在 Java 8 接口引入了一些新功能——默认方法和静态方法。..
2021-07-05 11:23:34
3433
2
原创 Spring如何解决循环依赖的
Spring使用三级缓存解决的:三级缓存:SingletonObject:全成品(10):key:beanName value:实例化并初始化完成的对象 EarlySingletonObject:半成品(5):key:beanName value:实例化好的对象(如果需要aop代理,则此时已被Aop代理) SingletonFactory:半半成品(3):key:beanName value:ObjectFactory一个对象进入缓存的顺序:初始都是进入到三级缓存,一旦有人引用它将他提为二
2021-07-04 22:43:21
221
原创 手写阻塞队列V1
public class MyBlockingQueue<E> { public static void main(String[] args) throws Exception { MyBlockingQueue<Integer> blockingQueue = new MyBlockingQueue<Integer>(5); new Thread(new Runnable() { @Override.
2021-07-02 20:43:11
146
原创 ConcurrentLinkedQueue源码分析
并编程中,一般需要用到安全的队列,如果要自己实现安全队列,可以使用2种方式:方式1:加锁,这种实现方式就是我们常说的阻塞队列。方式2:使用循环CAS算法实现,这种方式实现队列称之为非阻塞队列。从点到面, 下面我们来看下非阻塞队列经典实现类:ConcurrentLinkedQueue (JDK1.8版)ConcurrentLinkedQueue 是一个基于链接节点的无界线程安全的队列,按照先进先出原则对元素进行排序。新元素从队列尾部插入,而获取队列元素,则需要从队列头部获取...
2021-05-14 18:55:39
541
1
原创 LinkedBlockingQueue源码分析
目录LinkedBlockingQueue实现总结基本认识put(E e)方法E take()方法remove()方法size()方法LinkedBlockingQueue实现总结LinkedBlockingQueue底层是一个链表(可以指定容量,默认是Integer.MAX_VALUE),维持了两把锁,一把锁用于入队,一把锁用于出队,并且使用一个AtomicInterger类型的变量保证线程安全,AtomicInterger:表示当前队列中含有的元素个数:生产者不断进
2021-05-14 18:19:07
81
原创 ArrayBlockingQueue阻塞队列实现分析
基本认识:生产者去生产和消费者去消费都需要拿到此锁,拿不到就进入lock的AQS队列:ReerantLock lock 消费者去消费的条件队列:Condition notEmpty 生产者继续生产的条件队列:Condition notFull putIndex(每一轮都是从0-array.length,走到array.length后,继续从0开始下一轮):下一个生产者生产的位置 takeIndex(每一轮都是从0-array.length,走到array.length后,继续从0开始下一轮):下
2021-05-14 14:50:36
252
翻译 Lock Condition源码分析
JUC提供了Lock可以方便的进行锁操作,但是有时候我们也需要对线程进行条件性的阻塞和唤醒,这时我们就需要condition条件变量,它就像是在线程上加了多个开关,可以方便的对持有锁的线程进行阻塞和唤醒。Condition的概念Condition主要是为了在J.U.C框架中提供和Java传统的监视器风格的wait,notify和notifyAll方法类似的功能。JDK的官方解释如下:条件(也称为条件队列 或条件变量)为线程提供了一个含义,以便在某个状态条件现在可能为 true 的另一个线程通.
2021-05-14 11:32:10
202
原创 ConcurrentHashMap精简篇(无源码)
目录Concurrent HashMap(数组+链表+红黑树)ConcurrentHashMap.transfer()多线程扩容ConcurrentHashMap扩容源码分析总结:ConcurrentHashMap.put()过程总结((hash值)& (数组长度-1)确定位置)ConcurrentHashMap.get()(hash值)& (数组长度-1)确定位置)扩容时可以get】ConcurrentHashMap.size()Jdk1.7Concurrent
2021-05-13 18:21:34
361
3
原创 ThreadPoolExecutor线程池原理
思考:核心线程怎么实现不释放的?临时线程又是怎么实现释放的?核心线程: while(true)逻辑: 从阻塞队列里获取任务take(),获取到就继续执行,获取不到就一直阻塞在take里。临时线程:可以在blockQueue.take(timeOut)带有超时时间的获取,获取不到就退出(达到了释放)基本认识private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));ctl高3位用来标记线程池状态,低29位来标
2021-05-13 17:41:43
163
原创 ConcurrentHashMap源码分析
目录重要的属性sizeCtl重要的内部类初始化方法initTableConcurrentHashMap.transfer()扩容ConcurrentHashMap.put()ConcurrentHashMap.get()ConcurrentHashMap.size()ConcurrentHashMap与同是线程安全的老大哥HashTable相比,它已经更胜一筹,因此它的锁更加细化,而不是像HashTable一样为几乎每个方法都添加了synchronized锁,这样的锁无疑会.
2021-05-12 21:02:05
341
3
原创 Linux下安装Mysql 8.0
目录Mysql安装包官网下载教程安装步骤:下载载后上传至linux服务器,比如目录:/mysql配置my.cnf并初始化数据库配置Centos Linux启动和停止脚本并启动修改Root用户密码设置root用户可以远程登录(默认不允许)防火墙放行3306端口使用root进行远程连接Mysql安装包官网下载教程http://www.fgedu.net/2429.htmls安装步骤:下载载后上传至linux服务器,比如目录:/mysql配置...
2021-04-29 22:57:28
297
转载 Unsafe大致了解
https://www.cnblogs.com/mickole/articles/3757278.htmlJava中Unsafe类详解java不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe类提供了硬件级别的原子操作,主要提供了以下功能:1、通过Unsafe类可以分配内存,可以释放内存:类中提供的3个本地方法allocateMemory、reallocateMemory、freeMemory分别用于分配内存,扩充内存和释放内存,与C语言中的3个方法对应。2、可以定位对象某字
2020-08-13 21:17:51
236
原创 ReadWriteLock原理
ReentrantReadWriteLock重入读写锁:实现了ReadWriteLock接口,ReadWriteLock.readLock()需要返回读锁,ReadWriteLock.writeLock()需要返回写锁内部类:Sync(又分为FailSync和NonFairSync) ,ReadLock(里面又有一个Sync类变量), WriteLock(里面又有一个Sync类...
2020-08-08 17:59:47
598
原创 ReentrantLock加锁(lock())、释放锁(unlock())的实现
目录1、lock()过程总结2、 unLock()过程总结3、lock()源码分析1、抢占锁源码TryAquire():分析2、队列形成及阻塞源码分析1、形成队列过程2、形成队列阻塞的过程4、unLock()源码分析1、lock()过程总结lock()关键代码:public final void acquire(int arg) { ...
2020-04-08 20:30:14
1377
转载 ReentrantLock加锁(lock())、释放锁(unlock())的实现
ReentrantLock加锁(lock())、释放锁(unlock())的实现丑星星关注0.0512017.05.03 15:59:31字数 4,627阅读 3,641一、简介ReentrantLock是JUC包下比较重要同样也是比较常用的一个类,从类名可以看出它的功能:Lock是锁,reentrant可重入,可重入锁。在功能上ReentrantLock和synchroniz...
2020-04-08 11:47:09
1445
转载 Java的LockSupport的park和unpark的基本使用,以及对线程中断的响应性
park和unpark基本介绍LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语。LockSupport实际上是调用了Unsafe类里的函数,归结到Unsafe里,只有两个函数: public native void unpark(Thread jthread); public native void park(boolean isA...
2020-04-01 21:58:19
542
原创 线程安全性问题
线程安全的源头问题1.可见性cpu增加了高速缓存,均衡与内存的速度差异,这使得多个线程拿到共享资源后,分别在不同的cpu上执行,每个cpu都拥有自己的高速缓存,每个线程在不同的高速缓存里,互相之间并不可见,如:俩个线程同时拿到i=0,第一个线程在自己的缓存里写i=1,第二个线程并不知道2.原子性初始i=0 i++实际上分3步操作,1.获取值2.加一3.写回内存这使得第一个线程...
2020-02-14 19:10:49
313
java命令
在一个目录建立一个HelloWorld.javapublic class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); }}在该目录下打开命令窗口(地址栏清空然后输入cmd即可打开)//添加Packagepacka...
2020-02-14 12:15:14
94
原创 线程基本操作
1.Thread joint1.join作用就是等t1运行完,主线程才会继续往下执行public class MyThread1 extends Thread { @Override public void run() { try { TimeUnit.MICROSECONDS.sleep(1000); Sy...
2020-02-13 15:49:43
211
原创 Idea生成java文档及查看字节码文件
目录idea生成java文档idea反编译查看类的字节码文件idea生成java文档idea反编译查看类的字节码文件配置好以后,使用
2020-01-12 12:17:47
978
原创 ArrayList源码分析
目录ArrayList底层是采用数组ArrayList构造函数ArrayList add分析ArrayList Get分析ArrayList Remove分析LinkedList底层是链表LinkedList构造函数LinkedList add分析LinkedList Remove分析LinkedList Get分析ArrayList底层是采用数组...
2020-01-11 18:26:03
112
原创 HashTable源码分析
目录HashTableHashTable构造函数HashTablePut分析HashTable扩容分析HashTableGet分析HashTable Remove分析HashTable初始容量是11,加载因子是0.75,是线程安全的HashMap,底层采用数组加链表(没有红黑树),每个方法都加了synchronized保证线程安全HashTable构造...
2020-01-11 15:45:49
261
原创 HashSet和TreeSet源码分析
目录HashSet底层HashSet构造函数HaseSet add分析TreeSet底层TreeSet构造函数TreeSet add分析HashSet底层 是一个HashMap,只不过HashMap里面每个key对应的value值都是一样的PRESENT private static final Object PRESENT = ne...
2020-01-11 13:27:58
165
原创 TreeMap源码分析
目录TreeMap底层采用红黑树存储TreeMap构造函数TreeMap Put分析TreeMap Get分析TreeMap Remove分析TreeMap底层采用红黑树存储TreeMap构造函数public TreeMap() { comparator = null;//只是把比较器置为null,并未开辟空间}TreeMap Put分析初...
2020-01-11 12:57:39
398
原创 JDK1.8 HashMap源码分析
目录HashMap底层结构基本介绍构造函数HashMap Put过程分析HashMap扩容分析HashMap Get分析HashMap Remove分析HashMap底层结构基本介绍HashMap采用数组加链表(链表节点个数到达8个,链表将会转化为红黑树,红黑树节点个数少于6个,红黑树将会变成链表),默认加载因子是0.75,即元素个数达到数组总长度的0.75...
2020-01-09 00:25:38
135
1
原创 三种创建线程的方法
目录实现Runnable接口继承Thread通过FuturerTask和Callable实现Runnable接口 public static void main(String[] args) { for (int i = 0; i < 100; i++) { new Thread(new Runnable() {//...
2019-12-01 17:13:10
255
原创 日期类型参数接收和响应处理
目录前台直接向controller传Date类型参数前台向controller传JavaBean,JavaBean里面有Date类型参数JSP格式化Date类型参数前台直接向controller传Date类型参数 //不加DateTimeFormat注解,不可以接收 @RequestMapping("/welcome") public Date save(@...
2019-08-25 19:26:16
768
原创 springmvc参数接收
目录基本参数绑定一次保存俩个对象,并且对象之间有相同的属性名(InitBinder可以自定义绑定规则)此controller都返回json,返回json需要添加一个jackson的jar包,对象转json使用<dependency> <groupId>com.fasterxml.jackson.core</groupId> &l...
2019-08-25 17:09:55
162
原创 ModelAttribute和RedirectAttribute用法
目录ModelAttribute用法一:标注在方法上二:标注在方法的参数上重定向传参RedirectAttributes一 : 拼接到url上二 : 放入session中ModelAttribute用法一:标注在方法上controller中的每个方法访问时都会首先执行标有ModelAttribute注解的方法,并把方法返回值放入request域中...
2019-08-24 22:39:00
1641
原创 处理器(controller)的响应处理
@Controllerpublic class HelloController { //最原始的响应 @RequestMapping("/getOriginalResponse") public void getOriginalResponse(HttpServletRequest request, HttpServletResponse response) throw...
2019-08-20 23:59:53
435
原创 request域中放入参数几种方法
目录ModelModelMapModelAttributerequest.setAttribute(最原始的)modelAndVIew.addObjectModel //返回界面 @RequestMapping("/getUiModel") public String getUiModel(Model model) { mode...
2019-08-20 23:55:49
4097
原创 webapp下静态资源的访问
静态资源访问前言:web.xml<mvc:resources mapping="/**" location="classpath:/views/"/><!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http...
2019-08-18 19:07:29
5639
原创 WEB-INF下资源文件的访问
目录WEB-INF下文件相关SpringMVC.xmlweb.xmlController启动服务器直接访问(404)启动服务器通过controller访问(成功)WEB-INF下文件相关WEB-INF下资源文件的安全性较高,它是不能直接通过浏览器直接访问的。访问它的方式只有一种,那就是通过服务器来访问。只能通过控制层来访问。而对于WEB-INF下的文件为了书写方...
2019-08-18 15:20:11
3212
原创 SpringMVC的第一个程序
目录SpringMvc基本流程图webapp下新建welcome.jspsrc.main.java下新建HelloController在resource下新SpringMVC.xml在webapp的WEB-INF下新建web.xml配置服务器启动服务器访问http://localhost:8080/helloSpringMvc基本流程图...
2019-08-15 00:14:06
102
原创 Spring 事务
目录没有事务的转账场景Spring基于XML的事务Spring 基于注解的事务Spring事务传播行为require没有事务的转账场景resources下db.properties spring_config.xmldb.properties#我用的是mysql的8.0.16版本,对于8系列版本有2项注意事项# 1.jdbcUrl后面这个serverTimezo...
2019-06-30 13:48:38
68
原创 Spring JdbcTemplate
目录spring集成datasourceSpring JdbcTemplatespring集成datasource在resources目录下创建db.properties, spring-config.xmldb.properties#我用的是mysql的8.0.16版本,对于8系列版本有2项注意事项# 1.jdbcUrl后面这个serverTimezone=UTC必须...
2019-06-30 11:32:11
84
原创 Mock框架 Mockito
mock的定义mock是在测试过程中,对于一些不容易构造/获取的对象,创建一个mock对象来模拟对象的行为比较流行的Mock 如下(本文介绍Mockito):JMockEasyMockMockitopowermockmock使用场景Mockito测试package mockito;/*@description<br/>@author...
2019-06-30 10:56:51
661
原创 Spring Aop
目录Aop简介Xml方式实现Aop增强拓展注解方式实现AopAop简介Aop面向切面的编程,就是把很多功能重复的代码抽象出来形成切面类代码,再有运行时向业务方法中动态植入切面类代码。关注点:重复的代码切面:关注点形成的类叫切面类切入点:植入切面类代码的地方,通过切入点表达式,指定拦截哪些类的哪些方法,在这里植入切面类代码。在介绍spring...
2019-06-23 23:21:54
95
原创 Cglib代理
目录Cglib代理Cglib代理适用场景注意事项Cglib代理子类代理,在内存中构建一个子类对象从而实现对目标对象的扩展。Cglib代理适用场景有一个目标对象,但是没有接口import org.springframework.cglib.proxy.Enhancer;//代理工厂提供获取代理的方法public class CglibProxyFactory ...
2019-06-23 12:47:18
286
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人