java
文章平均质量分 84
这是我的昵称。。
。。。。。。。。。。。。。。。。。。
展开
-
logback 配置详解(二)——appender
目录1、appender 1.1、ConsoleAppender 1.2、FileAppender 1.3、RollingFileAppender 1.4、其他**Appender 2、encoder正文回到顶部1、appender <appender>是<configuration>的子节点,是负责写日志的组件。 <appender>有两个必要属性name和class。name指定appender名称,cla.转载 2021-03-11 17:04:03 · 983 阅读 · 0 评论 -
logback 配置详解(一)——logger、root
目录1、根节点包含的属性 2、根节点的子节点 2.1、设置上下文名称: 2.2、设置loger、root 正文回到顶部1、根节点<configuration>包含的属性scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。debug:当此属性设置.转载 2021-03-11 17:00:21 · 603 阅读 · 1 评论 -
一些JVM常用参数配置
GC 常用参数-Xmn -Xms -Xmx –Xss 年轻代 最小堆 最大堆 栈空间-XX:+UseTLAB -XX:+PrintTLAB -XX:TLABSize 使用 TLAB, 默认打开 打印 TLAB 的使用情况 设置 TLAB 大小 -XX:+DisableExplicitGC 启用用于禁用对的调用处理的选项 System.gc() -XX:+PrintGC 查看 GC 基本信息 -XX:+PrintGCDetails -XX.原创 2021-01-21 14:52:22 · 211 阅读 · 0 评论 -
ScopedProxy----spring多例情况下代理的实现
1、多例的bean@Component@Scope(value = DefaultListableBeanFactory.SCOPE_PROTOTYPE, proxyMode = ScopedProxyMode.TARGET_CLASS)public class ScopedProxyBean { public void code() { System.out.println(this.hashCode());//直接打印hashcode值,若每次打印的一致则是同一个对象原创 2021-01-18 15:01:26 · 380 阅读 · 0 评论 -
spring中自定义对象交给spring容器管理的4种方式
1、自定义一个 BeanDefinition@Componentpublic class BeanPro implements BeanDefinitionRegistryPostProcessor, PriorityOrdered, Ordered { @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {原创 2021-01-05 13:58:54 · 2041 阅读 · 4 评论 -
Spring之 Event事件通知机制
Spring的事件通知机制是一项很有用的功能,使用事件机制我们可以将相互耦合的代码解耦,从而方便功能的修改与添加。本文我来学习并分析一下Spring中事件的原理。举个例子,假设有一个添加评论的方法,在评论添加成功之后需要进行修改redis缓存、给用户添加积分等等操作。当然可以在添加评论的代码后面假设这些操作,但是这样的代码违反了设计模式的多项原则:单一职责原则、迪米特法则、开闭原则。一句话说就是耦合性太大了,比如将来评论添加成功之后还需要有另外一个操作,这时候我们就需要去修改我们的添加评论代码了。转载 2020-12-24 15:54:10 · 309 阅读 · 1 评论 -
Spring5.2.8之Aware接口
Spring5.2.8之Aware接口接口使用demo源码分析Aware.java是个没有定义任何方法的接口,拥有众多子接口,在spring源码中有多处都在使用这些子接口完成各种场景下的回调操作,当业务有需要时,我们只需创建类来实现相关接口,再声明为bean,就可以被spring容器主动回调.接口使用demo@Componentpublic class AwareBean implements BeanNameAware {@Overridepublic void setBeanName(Str原创 2020-12-24 15:06:26 · 191 阅读 · 0 评论 -
CyclicBarrier
cyclicBarrier 重复栅栏(CountDownLatch),语法和CountDownLatch差不多基本语法//初始化一个cyclicBarrier 计数器为2CyclicBarrier cyclicBarrier = new CyclicBarrier(2);//阻塞 计数器不为0的时候并且会把计数器-1cyclicBarrier.await();示例代码import lombok.extern.slf4j.Slf4j;import java.util.concurr..原创 2020-11-26 16:48:46 · 121 阅读 · 0 评论 -
CountDownLatch
倒计时锁;某个线程x等待倒计时为0的时候才执行;所谓的倒计时其实就是一个int类型的变量,在初始化CountDownLatch的时候会给他一个初始值(程序员定的);在多线程工作的时候可以通过countDown()方法来对计数器-1;当等于0的时候x则会解阻塞运行基本语法 //初始化对象,给一个初始值 CountDownLatch latch = new CountDownLatch(3); //x线程 调用await阻塞 等待计数器为0的时候才会解阻塞 l...原创 2020-11-26 16:42:15 · 134 阅读 · 0 评论 -
samephore
来限制对资源访问的线程的上限;好比洗浴店里面的手牌,比如你进去一个洗浴店里,服务生首先会给你一个手牌;如果手牌没有了你则需要去喝茶等待;等他其他问洗完你才可以去享受服务;手牌相当于你一个许可;你去享受服务的时候先要获取手牌,服务完成之后需要归还手牌;基本语法 //线程的上限 Semaphore semaphore = new Semaphore(3); //获取一个许可 - semaphore.acquire(); //释放 +...原创 2020-11-26 16:30:18 · 349 阅读 · 1 评论 -
粘包/半包问题
什么是 TCP 粘包半包?假设客户端分别发送了两个数据包 D1 和 D2 给服务端, 由于服务端一次读取到的字节数是不确定的, 故可能存在以下 4 种情况。(1) 服务端分两次读取到了两个独立的数据包, 分别是 D1 和 D2, 没有粘包和拆包;(2) 服务端一次接收到了两个数据包, D1 和 D2 粘合在一起, 被称为 TCP 粘包;(3) 服务端分两次读取到了两个数据包, 第一次读取到了完整的 D1 包和 D2 包的部分内容, 第二次读取到了 D2 包的剩余内容, 这被称为 TCP 拆原创 2020-11-05 15:55:31 · 173 阅读 · 0 评论 -
netty---ByteBuf
ByteBufByteBuf API 的优点:它可以被用户自定义的缓冲区类型扩展;通过内置的复合缓冲区类型实现了透明的零拷贝;容量可以按需增长(类似于 JDK 的 StringBuilder) ;在读和写这两种模式之间切换不需要调用 ByteBuffer 的 flip()方法;读和写使用了不同的索引;支持方法的链式调用;支持引用计数;支持池化。ByteBuf 维护了两个不同的索引, 名称以 read 或者 write 开头的 ByteBuf 方法, 将会推进其对应的索引, 而名称以 s原创 2020-11-05 15:37:52 · 341 阅读 · 0 评论 -
ChannelOption
ChannelOption 的各种属性在套接字选项中都有对应。1、 ChannelOption.SO_BACKLOGChannelOption.SO_BACKLOG 对应的是 tcp/ip 协议 listen 函数中的 backlog 参数, 函数listen(int socketfd,int backlog)用来初始化服务端可连接队列,服务端处理客户端连接请求是顺序处理的, 所以同一时间只能处理一个客户端连接, 多个客户端来的时候, 服务端将不能处理的客户端连接请求放在队列中等待处理, backl原创 2020-11-05 15:29:37 · 648 阅读 · 0 评论 -
netty组件----Bootstrap
Bootstrap网络编程里, “服务器” 和“客户端” 实际上表示了不同的网络行为; 换句话说, 是监听传入的连接还是建立到一个或者多个进程的连接。因此, 有两种类型的引导: 一种用于客户端(简单地称为 Bootstrap) , 而另一种(ServerBootstrap) 用于服务器。 无论你的应用程序使用哪种协议或者处理哪种类型的数据,唯一决定它使用哪种引导类的是它是作为一个客户端还是作为一个服务器。比较 Bootstrap 类ServerBootstrap 将绑定到一个端口, 因为服务原创 2020-11-05 15:27:48 · 239 阅读 · 1 评论 -
netty组件---ChannelPipeline 和 ChannelHandlerContext
ChannelPipeline 和 ChannelHandlerContextChannelPipeline 接口当 Channel 被创建时, 它将会被自动地分配一个新的 ChannelPipeline。 这项关联是永久性的; Channel 既不能附加另外一个 ChannelPipeline, 也不能分离其当前的。 在 Netty 组件的生命周期中, 这是一项固定的操作, 不需要开发人员的任何干预。使得事件流经 ChannelPipeline 是 ChannelHandler 的工作, 它们是在原创 2020-11-05 15:25:03 · 237 阅读 · 0 评论 -
netty组件---ChannelHandler
ChannelHandler 接口从应用程序开发人员的角度来看, Netty 的主要组件是 ChannelHandler, 它充当了所有处理入站和出站数据的应用程序逻辑的容器。 ChannelHandler 的方法是由网络事件触发的。事实上, ChannelHandler 可专门用于几乎任何类型的动作, 例如将数据从一种格式转换为另外一种格式, 例如各种编解码, 或者处理转换过程中所抛出的异常。举例来说, ChannelInboundHandler 是一个你将会经常实现的子接口。 这种类型的Ch原创 2020-11-05 15:19:43 · 326 阅读 · 0 评论 -
netty组件---EventLoop 和 EventLoopGroup
回想一下我们在 NIO 中是如何处理我们关心的事件的? 在一个 while 循环中 select 出事件, 然后依次处理每种事件。 我们可以把它称为事件循环, 这就是 EventLoop。 interfaceio.netty.channel. EventLoop 定义了 Netty 的核心抽象, 用于处理网络连接的生命周期中所发生的事件。io.netty.util.concurrent 包构建在 JDK 的 java.util.concurrent 包上。而 io.netty.channel 包中原创 2020-11-05 15:16:25 · 460 阅读 · 0 评论 -
netty组件--Channel、EventLoop(Group)和 ChannelFuture
Channel、EventLoop(Group)和 ChannelFutureNetty 网络抽象的代表:Channel—Socket;EventLoop—控制流、 多线程处理、 并发;ChannelFuture—异步通知。Channel 和 EventLoop 关系如图:Channel 接口基本的 I/O 操作(bind()、 connect()、 read()和 write()) 依赖于底层网络传输所提供的原语。 在基于 Java 的网络编程中, 其基本的构造是类 Socket。 Ne原创 2020-11-05 15:13:07 · 449 阅读 · 0 评论 -
netty组件初步了解
EventLoop(Group) 、ChannelChannel 是 Java NIO 的一个基本构造。它代表一个到实体(如一个硬件设备、 一个文件、 一个网络套接字或者一个能够执行一个或者多个不同的 I/O 操作的程序组件) 的开放连接, 如读操作和写操作目前, 可以把 Channel 看作是传入(入站) 或者传出(出站) 数据的载体。 因此, 它可以被打开或者被关闭, 连接或者断开连接。EventLoop 暂时可以看成一个线程、 EventLoopGroup 自然就可以看成线程组。事件和 C原创 2020-11-05 14:42:13 · 63 阅读 · 0 评论 -
HTTP
HTTPHTTP 协议是 Hyper Text Transfer Protocol(超文本传输协议) 的缩写,是用于从万维网(WWW:World Wide Web ) 服务器传输超文本到本地浏览器的传送协议。HTTP 协议我们使用 http 来访问 Web 上某个资源, 比如 html/文本、 word、 avi 电影、 其他资源。官方协议网站: https://tools.ietf.org/html/rfc2608HTTP 使用统一资源标识符(Uniform Resource Identifi原创 2020-10-26 09:37:55 · 94 阅读 · 0 评论 -
常用的网络工具 Wireshark 和 tcpdump
WireShark为什么要抓包1、 定位网络问题;2、 分析接口数据;3、 学习网络协议, 使用抓包工具分析网络数据更直观。大部分场合都可以通过程序调试来定位问题, 但有些场景使用抓包来定位接口问题更准确、 更方便, 如以下场景:1、 你发送数据给后台, 但后台没有收到, 可以对接口进行抓包分析, 看是后台处理有问题, 还是没有将数据发出去, 或是发送数据格式有误;2、 你和后台接口联调测通, 但业务数据对不上, 你认为是后台问题, 后台认为是你发的问题, 可以抓包确认问题所在;3、原创 2020-10-26 09:34:24 · 422 阅读 · 1 评论 -
TCP 概述
TCP(Transmission Control Protocol) 是面向连接的通信协议, 通过三次握手建立连接,然后才能开始数据的读写, 通讯完成时要拆除连接, 由于 TCP 是面向连接的所以只能用于端到端的通讯。TCP 提供的是一种可靠的数据流服务, 数据有可能被拆分后发送, 那么采用超时重传机制是和应答确认机制是组成 TCP 可靠传输的关键设计。而超时重传机制中最最重要的就是重传超时(RTO, Retransmission TimeOut) 的时间选择, 很明显, 在工程上和现实中网络环原创 2020-10-26 09:25:23 · 242 阅读 · 0 评论 -
网络编程基础知识
1、网络协议计算机网络是什么?随着计算机技术发展, 计算机的体积和价格都在下降, 之前计算机多用于研究机构, 现阶段逐步进入一般的公司用于办公。 原来计算机之间传输数据需要通过软盘等第三方存储介质进行转存, 人们需要将数据直接通过通信线路传输, 来缩短传输时间, 于是计算机网络开始诞生, 并逐渐发展为现在巨大的 Internet。定义和分类计算机网络的标准定义是: 利用通信线路将地理上分散的、 具有独立功能的计算机系统和通信设备按不同的形式连接起来, 以功能完善的网络软件及协议实现资源共享和原创 2020-10-26 09:22:44 · 334 阅读 · 0 评论 -
redis中RDB和AOF两种持久化方式的比较
1、RDB持久化机制就是我们俗称的备份,他可以在定期内对数据进行备份,将Redis服务器中的数据持久化到硬盘中;文件格式是:dump.rdb快照持久化通用的配置:RDB持久化的工作流程:Redis根据配置自己尝试生成RDB快照文件; fork一个子进程出来; 子进程尝试将数据写到临时的RDB快照文件中; 完成RDB快照文件的生成之后,就替换之前旧的快照文件;2、AOF持久化机制他会在执行写命令的时候,将执行的每条写命令以append-only的模式写入一个日志文件中存放在转载 2020-10-13 17:17:42 · 485 阅读 · 0 评论 -
ReentrantReadWriteLock--读写锁
ReentrantReadWriteLock-读写锁特点 1、读读并发 2、读写互斥 3、写写互斥 4、读锁 不支持条件 ---> throw new UnsupportedOperationException();用法tatic ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();static Lock r = rwl.readLock();static L...原创 2020-09-23 18:41:06 · 88 阅读 · 0 评论 -
ReentrantLock---基本用法
ReentrantLock 特点1、可打断、可重入2、可以设置超时时间3、可以设置为公平锁(默认为非公平锁)4、支持多个条件标量使用1、基本语法ReentrantLock lock = new ReentrantLock();//获取锁lock.lock();try { //临界区}finally { //释放锁 lock.unlock();}2、重入ReentrantLock lock = new ReentrantLock();原创 2020-09-23 18:12:31 · 2401 阅读 · 2 评论 -
Java特性——反射
概述定义JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。用途在日常的第三方应用开发过程中,经常会遇到某个类的某个成员变量、方法或是属性是私有的或是只对系统应用开放,这时候就可以利用Java的反射机制通过反射来获取所需的私有成员或是方法。当然,也不是所有的都适合反射,之前就遇到一个案例,通过反射得到的结果与预期不符。阅读源码发现,经过层层调用后转载 2020-09-18 13:55:20 · 92 阅读 · 0 评论 -
一道面试题:实现一个容器,提供两个方法,add,size 写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数到5个时,线程2给出提示并结束线程2
1、案例一/** * 一道面试题:实现一个容器,提供两个方法,add,size * 写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数, * 当个数到5个时,线程2给出提示并结束线程2 * * 这里list在两个线程之间不保证可见性,所以线程2始终结束不了 */@Slf4j(topic = "test")public class Container1 { List lists = new ArrayList(); public void add(Ob原创 2020-09-16 18:02:46 · 324 阅读 · 1 评论 -
一道面试题:多个atomic类连续调用能否构成原子性?
代码/** * atomicXXX * 一道面试题:多个atomic类连续调用能否构成原子性? */@Slf4j(topic = "test")public class Demo { AtomicInteger count = new AtomicInteger(0); public void test(){ for (int i = 0; i < 10000; i++) { if(count.get() < 1000原创 2020-09-16 17:59:26 · 324 阅读 · 0 评论 -
volatile 关键字
1、/** * volatile 关键字,使一个变量在多个线程间可见 * mian,t1线程都用到一个变量,java默认是T1线程中保留一份副本,这样如果main线程修改了该变量, * t1线程未必知道 * * 使用volatile关键字,会让所有线程都会读到变量的修改值 * * 在下面的代码中,running是存在于堆内存的t对象中 * 当线程t1开始运行的时候,会把running值从内存中读到t1线程的工作区,在运行过程中直接使用这个副本, * 并不会每次都去读取堆内存,这样,当原创 2020-09-16 17:42:04 · 280 阅读 · 0 评论 -
synchronized 和异常的关系
synchronized 和异常的关系,如果没有对异常进行try,则会释放锁,结束线程执行测试代码如下/** * synchronized 和异常的关系 * T2线程能否执行? */@Slf4j(topic = "test")public class Demo { Object o = new Object(); int count = 0; void test(){ synchronized(o) { //t1.原创 2020-09-16 17:28:56 · 368 阅读 · 0 评论 -
synchronized 锁的重入
1、/一个同步方法调用另外一个同步方法,能否得到锁?//重入 synchronized默认支持重入@Slf4j(topic = "test")public class Demo { synchronized void test1(){ log.debug("test1 start........."); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedEx原创 2020-09-16 17:24:51 · 95 阅读 · 0 评论 -
synchronized 可能会引起的脏读问题
/** * 脏读问题 * 实际业务当中应该看是否允许脏读, * 不允许的情况下对读方法也要加锁 在getBalance 方法上同样也加上synchronized 关键字就会避免脏读 */@Slf4j(topic = "test")public class Demo { //卡的持有人 String name; //卡上的余额 double balance; /** * * @param name * @param b.原创 2020-09-16 17:14:35 · 293 阅读 · 1 评论 -
synchronized使用
1、 synchronized关键字使用在方法上面,代码如下@Slf4j(topic = "test")public class BasicLock { public synchronized void x(){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); }原创 2020-09-16 16:43:44 · 111 阅读 · 0 评论 -
java开发八荣八耻
以动手实践为荣,以只看不练为耻.以打印日志为荣,以出错不报为耻.以局部变量为荣,以全局变量为耻.以单元测试为荣,以手工测试为耻.以代码重用为荣,以复制粘贴为耻.以多态应用为荣,以分支判断为耻.以定义常量为荣,以魔法数字为耻.以总结思考为荣,以不求甚解为耻....转载 2019-07-11 19:53:19 · 150 阅读 · 0 评论 -
Java poi+excel导入
用的SSM框架,所需要的jar包如图所示:,链接地址:jar包下载 ,下面直接上代码。1、ExcelUtil工具类[java] view plain copy"color:#993399;">"font-size:18px;color:#993399;">import java.text.DecimalFormat; im转载 2017-11-10 17:12:12 · 474 阅读 · 0 评论