- 博客(99)
- 收藏
- 关注
原创 jdk动态代理和cglib代理
Cglib和jdk动态代理的区别动态代理解决了方法之间的紧耦合,IOC解决了类与类之间的紧耦合!Cglib和jdk动态代理的区别?1、Jdk动态代理:利用拦截器(必须实现InvocationHandler)加上反射机制生成一个代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理2、 Cglib动态代理:利用ASM框架,对代理对象类生成的class文件加载进来,通过修改其字节码生成子类来处理什么时候用cglib什么时候用jdk动态代理?1、目标对象生成了接口 默认用JDK动态代
2021-11-27 00:37:38 266
原创 BIo实现简单聊天系统
1.client端package BioServer;import java.io.IOException;import java.io.OutputStream;import java.net.Socket;import java.util.Scanner;/** * Created by lwj32 on 2021/3/17. */public class BioClient { private static final TimeServerHandlerExec...
2021-03-23 23:54:05 204
原创 线程间通信
1、synchronized关键字实现原理:方法块是通过monitorentry和monitorexit去控制,而同步方法则 是依靠方法修饰符上的ACC_SYNCHRONIZED来完成的,两个方式都是通过获取对象的监控器实现,同时这种情况是排他的,也就是说同一个时间只能有一个线程获取对象扽监控器2、监控器,对象,同步队列和执行线程的关系线程进入同步队列,线程状态变为BLOCKED。当访问Object 的前驱(获得了锁的线程)释放了锁,则该释放操作唤醒阻塞在同步队列中的线程,使其重新.
2021-03-02 20:33:19 151
原创 2021-02-25线程启动和终止
1、启动线程线程对象在初始化完成之后,调用start()方法就可以启动这个线程。线程start()方法的含义 是:当前线程(即parent线程)同步告知Java虚拟机,只要线程规划器空闲,应立即启动调用 start()方法的线程。注意 启动一个线程前,最好为这个线程设置线程名称,因为这样在使用jstack分析程 序或者进行问题排查时,就会给开发人员提供一些提示,自定义的线程最好能够起个名字。2、中断线程中断可以理解为线程的一个标识位属性,它表示一个运行中的线程是否被其他线程进行 了中断操作。
2021-02-25 20:45:49 353
原创 线程介绍1.线程是啥 2、为啥使用多线程 3、线程优先级 4、线程状态 5、守护线程Daemon线程
1.线程是啥现代操作系统在运行一个程序时,会为其创建一个进程。例如,启动一个Java程序,操作 系统就会创建一个Java进程。现代操作系统调度的最小单元是线程,也叫轻量级进程(Light Weight Process),在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局 部变量等属性,并且能够访问共享的内存变量。处理器在这些线程上高速切换,让使用者感觉 到这些线程在同时执行。[4] Signal Dispatcher // 分发处理发送给JVM信号的线程[3] Finalizer
2021-02-25 16:21:30 162 1
原创 JMM内存模型综述
1.处理器的内存模型顺序一致性内存模型是一个理论参考模型,JMM和处理器内存模型在设计时通常会以顺 序一致性内存模型为参照。在设计时,JMM和处理器内存模型会对顺序一致性模型做一些放 松,因为如果完全按照顺序一致性模型来实现处理器和JMM,那么很多的处理器和编译器优 化都要被禁止,这对执行性能将会有很大的影响。JMM为程序员屏蔽了不同处理器的差异,2 各种内存模型之间的关系JMM是一个语言级的内存模型,处理器内存模型是硬件级的内存模型,顺序一致性内存 模型是一个理论参考模..
2021-02-24 23:05:42 135 1
转载 loadAnd store
作者:进击的码农链接:https://www.zhihu.com/question/325469611/answer/694336275来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。JVM内存模型的定义八种原子操作八种原子操作下的规则通过以上来定义了JVM的内存模型,也就是我们要遵守的协议八种原子操作分别为1.lock 锁定 : 把主内存中的一个变量标志为一个线程独享的状态2.unlock 解锁 : 把主内存中的一个变量释放出来3.r.
2021-02-23 23:27:24 561
原创 双重检测锁和延迟初始化基于类初始化的解决方案
在Java多线程程序中,有时候需要采用延迟初始化来降低初始化类和创建对象的开销。双 重检查锁定是常见的延迟初始化技术,但它是一个错误的用法。本文将分析双重检查锁定的 错误根源,以及两种线程安全的延迟初始化方案。1.问题根源:第7步可能拆分为memory = allocate(); // 1:分配对象的内存空间ctorInstance(memory); // 2:初始化对象instance = memory; // 3:设置instance指向刚分配的内存地上面的为代码可能会在2 和
2021-02-23 23:18:01 303 4
原创 happen-before定义,规则、
happen-before 是JMM的核心概念,我们追求的是啥·程序员对内存模型的使用。程序员希望内存模型易于理解、易于编程。程序员希望基于一个强内存模型来编写代码。·编译器和处理器对内存模型的实现。编译器和处理器希望内存模型对它们的束缚越少越 好,这样它们就可以做尽可能多的优化来提高性能。编译器和处理器希望实现一个弱内存模 型。由于这两个因素互相矛盾,所以JSR-133专家组在设计JMM时的核心目标就是找到一个 好的平衡点:一方面,要为程序员提供足够强的内存可见性保证;另一方面,对编译
2021-02-19 20:47:55 216
原创 final内存语义
1、final的重排规则:对于final域,处理器和编译器遵循两个规则,1、在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用 变量,这两个操作之间不能重排序。2、首次读有final域的对象引用和随后初次读这个final域,这两个操作之间不能 重排序。2、写final域的重排规则:1、JMM禁止将final域重排到构造函数外面2、编译器会在final域的写之后,构造函数return之前,插入一个StoreStore屏障。这个屏障 禁止处理器把fina
2021-02-19 19:02:01 251
原创 锁的内存含义
1.锁释放和获取建立的happens-before关系:锁是Java并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息。 下面是锁释放-获取的示例代码。class MonitorExample { int a = 0; public synchronized void writer() { // 1 a++; // 2} // 3 public synchronized void reader() {// 4
2021-02-19 15:54:39 229
原创 volatile语义级别分析
https://www.cnblogs.com/keeya/p/9255136.html1。可见行2、对变量的读写操作保证原子性,但是不能保证i++这类的操作因为这是三个操作也叫复合操作,这里里面包括了读取值 修改,写回到主内存。可能在前面读的时候拿到了最新的,但是可能其他线程在这个线程修改操作前,进行了修改然后相当于两个线程进行了相同的操作。volatile读写建立的的happeds-before关系: java5也就是JSR-133以后volatile修饰的可以进行线程间通信,...
2021-02-18 14:55:54 208
原创 原子类的实现 原理
1.基础概念2.处理器如何实现原子性首先处理器本身就通过对一个字节只能被一个处理器处理,其他处理器不能访问这个原子的内存地址,但是复杂的内存操作处理器是不能自动保证其原子性的,比如跨总线宽度、跨多个缓存行和跨页表的访问但是我们可以通过以下两种方式来保证复杂原子操作1.锁住总线我们就需要锁住总线,来保证i++每次数据都是+1而不是两个cpu之间可能出现从个自缓冲中拿出来值去做对比,然后本来就是要为3但是变成了2.因可能是多个处理器同时从各自的缓存中读取变量i,分别进行加1操作...
2021-02-04 15:09:46 639
原创 springboot分析ioc原理
1.读取bean配置信息2、实例化bean3.读取bean配置 信息4.应用程序使用hashmap缓存一份bean的信息,快速找到2、springmvc1.clienthttp请求过来通过dispatchServlet去找对应的handlermapping2.通过handlermapping获取handler 根据注解和配置找到具体执行的handler3.返回handler hanlerExecutionChain handlerInterceptor hand.
2021-02-03 23:40:10 722
原创 JMM顺序一致性,1.数据竞争和数据一致性2.顺序一致性3,同步程序的顺序一致性效果。4.未同步的程序特性
定义:顺序一致性是一种内存模型的理论参考模型,也就是他并不是实际存在的,处理器的内存模型和编程语言都会以它为参照。一、数据竞争和顺序一致性
2021-02-03 21:05:51 361 5
原创 spring eureka 注册中心单机搭建
一、为啥要有注册中心AP模型1.因为随着服务的增加我们需要对所有的服务有一个管理所以需要提供服务注册中心进行微服务信息管理。每个微服务要上报自己的ip和服务信息2.微服务向上汇自己的状态,注册中心统一管理,如果有问题,进行熔断操作。客户端去调用其他可用的服务。二、Eureka简介他们的模式cs的模式也就是client 和server 我们在我们服务器上配置eureka的client 我们上报自己的信息,然后eureka去eureka server 负责管理状态和信息...
2021-01-26 23:24:35 157 1
原创 JMM内存模型重排序1、重排序 2.as-if-serial语义 3.程序顺序规则
一、重排原因:为了提升代码的运行效率,所以编译器和处理器会对代码的执行顺序进行重新排序,但是有单处理器上和单线程上的数据依赖的一定不会重新排序,但是不同处理器和不同线程上的不考虑二、as-if-serial :as-if-serial的意思就是,无论如何重排,单线程都不会改变最终的执行结果如何做到:为了as-if-serial的实现,所以对有数据依赖的数据不进行重排,因为这种重排会改变结果。但是如果不存在数据依赖,那么就可能会被重排。如下图A和B直接没有数据依赖所以他们顺序改
2021-01-21 10:24:00 339
原创 JMM java内存模型 1.并发的关键,2.jmm内存模型,3.指令重排 4、happens-before
一.并发编程的两个关键性问题1.1线程通信通信是指线程间通过何种机制进行信息交换,在命令式编程中有两种方式,共享内存和信息传递共享内存:共享内存通信是指线程间有公共的状态,通过对内存中公共状态的写-读达到通信的目的,这种方式是隐式的通信。消息投递:消息投递的模式,没有共享内存的共同状态,所以线程间需要通过发送消息进行显式的通信。1.2线程同步(这里的线程是指并发执行的活动实体)同步是指不同线程间操作发生相对顺序的机制,在通信内存共享模式下,同步是显示进行的,程序员必须显式的对某个方法
2021-01-19 20:59:58 136
原创 局部性原理
cpu cache结构内存>L3>L2>L1多级缓存 这四级的速度是越来越快本质上内存是一个大的一维数组二维数组在内存中按照行排列,先放a【0】再放a【1】第一种arr1的遍历方式是行遍历先遍历完第一行再遍历第二行符合局部性原理 catchhit命中率高第二种arr2的遍历方式是列遍历,先遍历第一列后遍历第二列由于下一列和上一列的数组元素在内存中并不是连续很可能会造成catch miss cpu需要从内存中载入数据速度不如cpu L1 主存100ns L1 0.5ns.
2020-11-03 00:04:23 261
原创 设计模式1工厂模式实现
意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。主要解决:主要解决接口选择的问题。何时使用:我们明确地计划不同条件下创建不同实例时。如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。关键代码:创建过程在其子类执行。应用实例:1、您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。 2、Hibernate 换数据库只需换方言和驱动就可以。优点:1、一个调用者想创建一个对象..
2020-10-29 15:54:22 121
原创 redis过期淘汰策略
Redis占用内存大小我们知道Redis是基于内存的key-value数据库,因为系统的内存大小有限,所以我们在使用Redis的时候可以配置Redis能使用的最大的内存大小。如果不设置最大内存大小或者设置最大内存大小为0,在64位操作系统下不限制内存大小,在32位操作系统下最多使用3GB内存1.设置内存大小我们可以通过设置conf文件中的maxmemory去设置redis的最大内存2.设置过期策略maxmemory-policyconfig set maxmemory-polic
2020-08-25 16:43:42 219
原创 fastDfs安装配置
系统结构1.因为底层是用c语言写的首先下载c和c++的依赖2.下载libeventyum -y install libevent3.安装Tracker3.Storage安装测试修改/etc/fdfs/client.confNginx结合fastdfs测试类public void textFileUpload() throws IOExcepti...
2020-07-14 23:13:10 222
原创 dubbo理解
调用方法时会去执行代理对象dubbo.rpc.invokerinvocationHanlder有缓存的远程调用的服务和zookeeper的地址主要是通过fiter获取一系列如负载均衡等通过netty去返回值通过netty去调取服务
2020-06-30 23:03:19 171
原创 SpingAOP
Aop概述:是基于jdk动态代理的实现的和cglib面向切面编程和OOP面向对象编程的补充,面向切面:是横向的抽取,面向对象:是纵向继承AOP编程操作的主要对象是切面Aspect,而切面有用与模块化横切关注点(非业务代码)作用将业务代码和非业务区分开AOP的术语1.横切关注点也就是我们每一个方法共同要抽取出来的非核心代码2.切面aspect封装横切关注点的信息的类,每一个关注点体现为一个通知的方式3.Advice通知切面去完成的具体工作4.target
2020-06-19 19:33:06 263
原创 Spring初识
整合性框架,设计性框架非侵入式:依赖注入是IOC的最经典表现AOP:面向切面编程OOP面向切面编程Spring是一个容器因为它包含并管理应用对象的生命周期springbeans包也就是Ioc实现的包
2020-06-18 17:18:07 190
原创 linux下安装dubbo
安装前先卸载原来的jdkrpm -qa | grep jdkrpm -e --nodeps 卸载内容linx 安装jdk1.解压jdk包tar -zvf jdk2.配置环境变量JAVA_HOME=你的路径PATH=$PAHT:$JAVA_HOME/binCLASSPAHT=$JAVA_HOME/lib2.安装zookeeper2.1解压2.2将cp zoo_sample.cfg zoo.cfg2.3 cd /bin2.4 ./zkServer.sh .
2020-06-08 21:20:03 393
原创 dubbo了解soa框架搭建
高性能、轻量级的开源javaRPC框架,三个核心的功能:1.面向接口的远程方法调用2.智能容错,和负载均衡,3.服务自动注册和发现单一应用架构当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。垂直应用架构当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,提升效率的方法之一是将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。分布.
2020-06-07 22:57:21 126
原创 GCROOTs详解
java7永久代java8元空间如何去判断那些对象可以被回收呢1.引用计数法:被引用+1引用失效-12.枚举根节点做可达性分析:也就是有一个GCRoots对象作为根节点,然后做可达性分析,从这个对象向下搜索,如果一个对象到GCroots没有任何引用链相连,则说明该对象不可用。那些可以作为GCroots根对象:1.虚拟机栈引用的对象(栈帧中的局部变量区,也叫做局部变量表)2.方法区中的类静态属性引用的对象3.方法区中常量引用的对象。4.本地方法栈中JNI(native)引用
2020-06-07 00:57:07 832
原创 每日一题 分割平衡字符串String.charAt()影响时间
//为何第二次和第三次消耗时间还是有差距呢因为每次调用charAt时候都会将String转换为char[]数组所以直接一次转换完成后再去通过index取值就可以了提交时间提交结果执行用时内存消耗语言几秒前通过1 ms36.8 MBJava6 分钟前编译出错N/AN/AJava7 分钟前通过0 ms37.8 MBJava9 分钟前通过1 ms37.8 MBJava9 分钟前编译出错N/AN/AJavaString.charAt源码 /** The...
2020-06-04 16:26:38 187
原创 JVM内存结构垃圾回收算法
GC作用域:方法区和堆3.常见垃圾回收算法:3.1引用计数由对象引用则加1缺点:每次对对象赋值时都要维护引用计数器,且计数器本身也有一定消耗,比较难处理循环引用,JVM一般不采用这种方式3.2复制:年轻代1.eden、survivor form复制到surivivor to 年龄+1首先当eden第一次触发Gc时,会将对象复制到survivorForm区,当eden第二次触发Gc时会扫描Eden和SurvivorForm区,对这两个区域进行垃圾回收,仍然存活的则放入s..
2020-06-02 21:44:38 200
原创 线程池参数,拒绝策略 实际开发设置 详解
七大参数详解:1.corePoolSize :线程池中常驻的核心线程数2.maximumPoolSize :线程池同时最多可以执行的最大线程数,此值必须大于13.long keepAliveTime 多余空闲线程的存活时间4.TimeUnit unit, 时间的单位5.BlockingQueue<Runnable> workQueue 任务队列,别提交,但是尚未执行的任务6.ThreadFactory threadFactory,表示生成线程池中工作线程的线程工厂,用..
2020-06-01 23:33:35 533
原创 React组件学习
每一个组件都有一个状态,其保存在this.state中,当状态值发生改变时,react框架会自动调用render()方法,重新渲染也拿不创建组件:import React from 'react'class MyDemo extends React.Component { render() { return ( <div> 我的第一个组件,name = {this.props.name},内容={this
2020-05-30 21:18:50 111
原创 多线程下List和线程不安全详解
原因:并发修改List的时候,因为会出现修改抢占导致根本原因:List的add方法没有添加synchronized关键字修饰如何解决:1.使用VectorWhy因为Vector的add方法是加了synchronized的modCountint expectedModCount = modCount;public synchronized boolean add(E e) { modCount++; ensureCapacityHelper(ele...
2020-05-21 01:05:50 616
原创 ABA问题
这个是CAS中一个问题,主要形成原因是,因为CAS是因为CAS在取值时是取得某一时刻的数值,因此会出现线程1将数值A修改成B再将B修改成A,而线程2是将A修改成B因此1线程修改完2线程去修改时,对于整个过程是无感的,当然对于业务方面如果没有特殊要求的话,可以不用在乎如果有要求是就要注意整个问题解决:Atomic为我们解决了整个问题,类似与乐观锁,就是在取值时我们加一个版本号,在修改时,从版本号和数值两个方面去判断AtomicStampedReferencepackage ABADemo;
2020-05-18 21:44:49 199
原创 CAS详解附源码
CAS定义:CAS 也就是CompareAndSwap 比较并交换,主要为了解决多线程下的原子性,大体思想就是在更新前,进行比较,举个例子AtomicInteger 下的compareAndSet(expect,update) expect 为期望值也就是未更新的值,update是如果期望值相同则更新的值。原理:首先compareAndSe调用了rt.jar下的Unsafe类,这个类下的大部分方法和变量都用native修饰,也就是说更多的是操作是面向地址的,也就是当我们调用时会形成系统原语,原语
2020-05-17 23:18:41 343
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人