JAVA
文章平均质量分 79
Zhang.Voi
天道酬勤,业道酬精。
展开
-
Java 文件和IO流字符串(Base64字符串)互转
在项目中,我们往往会有离线设备交互文件的时候,就需要把文件转IO字符或者IO字符串转未文件;原创 2022-06-29 11:20:45 · 1517 阅读 · 0 评论 -
概况Java中的偏向锁、轻量级锁、重量级锁、自旋锁、自适应自旋锁
概况Java中的偏向锁、轻量级锁、重量级锁、自旋锁、自适应自旋锁原创 2022-06-16 10:54:59 · 1987 阅读 · 2 评论 -
SpringMVC 的工作流程
1、springmvc工作原理图2、springmvc工作流程1、 用户向服务端发送一次请求,这个请求会先到前端控制器DispatcherServlet(也叫中央控制器)。2、DispatcherServlet接收到请求后会调用HandlerMapping处理器映射器。由此得知,该请求该由哪个Controller来处理(并未调用Controller,只是得知)3、DispatcherServlet调用HandlerAdapter处理器适配器,告诉处理器适配器应该要去执行哪个Controlle原创 2021-12-15 11:29:37 · 329 阅读 · 0 评论 -
spring事务失效的原因
1:数据库引擎不支持事务这里以 MySQL 为例,其 MyISAM 引擎是不支持事务操作的,InnoDB 才是支持事务的引擎,一般要支持事务都会使用 InnoDB。根据 MySQL 的官方文档:https://dev.mysql.com/doc/refman/5.5/en/storage-engine-setting.html从 MySQL 5.5.5 开始的默认存储引擎是:InnoDB,之前默认的都是:MyISAM,所以这点要值得注意,底层引擎不支持事务再怎么搞都是白搭。2:没有.原创 2021-12-10 15:13:00 · 157 阅读 · 0 评论 -
Spring AOP——Spring 中面向切面编程
一、AOP——另一种编程思想1.1 什么是 AOPAOP (Aspect Orient Programming),直译过来就是 面向切面编程。AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将程序抽象成各个切面。从《Spring实战(第4版)》图书中扒了一张图:从该图可以很形象地看出,所谓切面,相当于应用对象间的横切点,我们可以将其单独抽象为单独的模块。1.2 为什么需要 AOP想象下面的场景,开发中在多个模块间有原创 2021-11-30 16:36:29 · 156 阅读 · 0 评论 -
Java并发编程:Java线程池核心ThreadPoolExecutor的使用和原理分析
引出线程池线程是并发编程的基础,前面的文章里,我们的实例基本都是基于线程开发作为实例,并且都是使用的时候就创建一个线程。这种方式比较简单,但是存在一个问题,那就是线程的数量问题。假设有一个系统比较复杂,需要的线程数很多,如果都是采用这种方式来创建线程的话,那么就会极大的消耗系统资源。首先是因为线程本身的创建和销毁需要时间,如果每个小任务都创建一个线程,那么就会大大降低系统的效率。其次是线程本身也是占用内存空间的,大量的线程运行会抢占内存资源,处理不当很可能会内存溢出,这显然不是我们想看到的。那么原创 2021-11-23 19:34:40 · 661 阅读 · 0 评论 -
Java中Runnable和Thread的区别
概述Runnable 是接口。Thread 是类,且实现了Runnable接口。Thread部分源码public class Thread implements Runnable{ private static class Caches { static final ConcurrentMap subclassAudits = new ConcurrentHashMap(); static final ReferenceQueu原创 2021-11-16 10:41:20 · 1313 阅读 · 0 评论 -
Java内存垃圾回收(GC)原理
一、为什么需要垃圾回收 如果不进行垃圾回收,内存迟早都会被消耗空,因为我们在不断的分配内存空间而不进行回收。除非内存无限大,我们可以任性的分配而不回收,但是事实并非如此。所以,垃圾回收是必须的。二、哪些内存需要回收?哪些内存需要回收是垃圾回收机制第一个要考虑的问题,所谓“要回收的垃圾”无非就是那些不可能再被任何途径使用的对象。那么如何找到这些对象?1、引用计数法这个算法的实现是,给对象中添加一个引用计数器,每当一个地方引用这个对象时,计数器值+1;当引用失效时,计数器值-1。任何时刻计原创 2021-11-09 19:55:46 · 1446 阅读 · 0 评论 -
Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法。 以下是本文目录大纲: 一.CountDownLatch用法 二.CyclicBarrier用法 三.Semaphore用法 若有不正之处请多多谅解,并欢迎批评指正。 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin052原创 2021-09-13 15:18:47 · 99 阅读 · 0 评论 -
Java 原子性,可见性,有序性概念
一、简介volatile是Java提供的一种轻量级的同步机制。Java语言包含两种内在的同步机制:同步块(或方法)和volatile变量,相比于synchronized(synchronized通常称为重量级锁),volatile更轻量级,因为它不会引起线程上下文的切换和调度。但是volatile变量的同步性较差(有时它更简单并且开销更低),而且其使用也更容易出错。二、并发编程的3个基本概念1.原子性定义: 即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断...原创 2021-06-24 11:48:47 · 303 阅读 · 0 评论 -
分布式锁的三种实现方式
分布式锁三种实现方式: 1 2 3 1. 基于数据库实现分布式锁; 2. 基于缓存(Redis等)实现分布式锁; 3. 基于Zookeeper实现分布式锁; 一, 基于数据库实现分布式锁1. 悲观锁利用select … where … for update 排他锁注意: 其他附加功能与实现一基本一致,这里需要注意的是“where name=lock ”,name字段必须要走索引,否则会锁表。有些情况下,比如表..原创 2021-04-07 16:08:10 · 130 阅读 · 0 评论 -
Java原子类应用场景如:AtomicInteger的使用
Java中有那么一些类,是以Atomic开头的。这一系列的类我们称之为原子操作类。原子类建立在 CAS 和 volatile 之上,CAS 是非阻塞算法的一种常见实现,相对于 synchronized 这种阻塞算法,它的性能更好。以最简单的类AtomicInteger为例。它相当于一个int变量,我们执行Int的 i++ 的时候并不是一个原子操作。而使用AtomicInteger的incrementAndGet却能保证原子操作。具体的类如下:闲话不多说,还是用实例说话吧。问题:现在有2...原创 2021-03-03 14:53:30 · 1290 阅读 · 2 评论 -
AQS和CAS原理
锁机制(AQS和CAS)一、AQS 1、AQS原理 AQS:AbstractQuenedSynchronizer抽象的队列式同步器。是除了java自带的synchronized关键字之外的锁机制。 AQS的全称为(AbstractQueuedSynchronizer),这个类在java.util.concurrent.locks包 2、AQS的核心思想 如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并将共享资源设置为锁定状态,如果被请求的共原创 2021-02-25 09:52:07 · 4045 阅读 · 4 评论 -
synchronized 和 volatile 关键字的作用、区别
synchronized synchronized 则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。也就是说如果分别有两个线程A、B,这个时候在访问同一个变量value,这个时候使用该关键字。如果线程A 拿到锁之后,线程B 就不能获取,只能被等待。volatile 保证了线程A、B对这个变量value 进行操作时的可见性,即A线程修改了某个变量value的值,这新值对线程B来说是 立即可见的。区别 两者的区别主要是在使用方式、原子性、可见性、线程阻塞、编译优化方面。原创 2021-02-21 15:04:45 · 232 阅读 · 0 评论 -
synchronized与ReentrantLock的区别
工作与面试中经常会遇到Java常见的加锁方法,本文着重介绍synchronized与ReentrantLock的区别。①底层实现上来说,synchronized 是JVM层面的锁,是Java关键字,通过monitor对象来完成(monitorenter与monitorexit),对象只有在同步块或同步方法中才能调用wait/notify方法,ReentrantLock 是从jdk1.5以来(java.util.concurrent.locks.Lock)提供的API层面的锁。synchronize.原创 2021-02-21 14:08:07 · 183 阅读 · 0 评论 -
LIST,SET,MAP各个实现类的理解
LIST,SET,MAP各个实现类的理解集合集合与数组数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用。集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使用。集合中接口和类的关系Collection接口是集合类的根接口,Java中没有提供这个接口的直接的实现类。但是却让其被继承产生了两个接口,就是Set和List。Set中不能包含重复的元素。List是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式原创 2021-01-28 15:29:06 · 521 阅读 · 0 评论 -
Java中的final关键字分析
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字。另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法。下面是本文的目录大纲: 一.final关键字的基本用法 二.深入理解final关键字 若有不正之处,请多多谅解并欢迎指正。 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin0520/p/3736238.html一.final关原创 2020-12-25 10:09:17 · 102 阅读 · 0 评论 -
Java抽象类与接口的区别
很多常见的面试题都会出诸如抽象类和接口有什么区别,什么情况下会使用抽象类和什么情况你会使用接口这样的问题。本文我们将仔细讨论这些话题。在讨论它们之间的不同点之前,我们先看看抽象类、接口各自的特性。抽象类抽象类是用来捕捉子类的通用特性的 。它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板。以JDK中的GenericServlet为例:public abstract class GenericServlet implements Servlet, Servle.原创 2020-12-23 10:25:24 · 95 阅读 · 0 评论 -
HashTable和HashMap的区别详细解释
一、HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。 HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。 HashMap实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆。 HashMap存数据的过程是:...原创 2020-12-21 16:10:56 · 143 阅读 · 0 评论 -
Socket通讯-Netty框架实现Java通讯
Netty简介Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。也就是说,Netty 是一个基于NIO的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。Netty相当简化和流线化了网络应用的编程开发过程,例如,TCP和UDP的socket服务开发。“快速”和“简单”并不用产生维护性或性能上的问题。Netty 是一原创 2020-11-10 14:06:58 · 558 阅读 · 0 评论 -
Java树形结构递归(以时间换空间)和非递归(以空间换时间)
Java树形结构递归(以时间换空间)和非递归(以空间换时间)使用场景:如果层级比较多和数据量比较大建议用非递归方式效率更高;树形结构如下图测试类代码:package com.zxq.tree_dom;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONArray;import java.util.*;public class Test { public static void main原创 2020-11-09 10:39:58 · 739 阅读 · 0 评论 -
redis中保证缓存数据的一致性
1.方式一:先更新数据库,再更新缓存场景当有两个线程A、B,同时对一条数据进行操作,一开始数据库和redis的数据都为tony,当线程A去修改数据库,将tong改为allen,然后线程A在修改缓存中的数据,可能因为网络原因出现延迟,这个时候线程B,将数据修改成了Mike、然后将数据库中的tony,也改成了Mike,然后线程A恢复正常,将redis中的缓存改成了allen,此时就出现了缓存数据和数据库数据不一致情况。不推荐返回目录2.方式二:先更新缓存,再更新数据库场景当有两个线程A、B,原创 2020-10-27 19:06:26 · 304 阅读 · 0 评论 -
JVM结构及堆的划分
一、JVM结构1、类加载子系统与方法区 类加载子系统负责从文件系统或者网络中加载Class信息,加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中可能还会存放运行时常量池信息,包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)。2、Java堆 java堆在虚拟机启动的时候建立,它是java程序最主要的内存工作区域。几乎所有的java对象实例都存放在java堆中。堆空间是所有线程共享的,这是一块与java应用密切相关的内存空间。...原创 2020-10-27 10:56:49 · 949 阅读 · 0 评论 -
volatile,synchronized和lock使用场景
volatile,synchronized和lock使用场景:volatile关键字的作用简单来说就是保证了Java并发编程中的可见性、有序性,但不能保证原子性。synchronized和lock可以保证并发编程的可见性、有序性、原子性,即并发程序的安全,但是性能会差些,所以在一些对变量的操作已经是原子性的情况下,可以使用volatile关键字。一.内存模型的相关概念 大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取...原创 2020-10-26 17:50:57 · 866 阅读 · 0 评论 -
sychronized的偏向锁,轻量级锁,自旋锁,重量级锁详细介绍
目录Java对象头 几种锁的类型 偏向锁 自旋锁 轻量级锁 重量级锁 锁的优缺点对比何为同步?JVM规范规定JVM基于进入和退出Monitor对象来实现方法同步和代码块同步,但两者的实现细节不一样。代码块同步是使用monitorenter和monitorexit指令实现,而方法同步是使用另外一种方式实现的,细节在JVM规范里并没有详细说明,但是方法的同步同样可以使用这两个指令来实现。monitorenter指令是在编译后插入到同步代码块的开始位置,而monitorexit是.原创 2020-10-14 11:47:12 · 244 阅读 · 0 评论 -
Java 实现ftp 文件上传、下载和删除
Java 实现ftp 文件上传、下载和删除本文利用apache ftp工具实现文件的上传下载和删除。具体如下:1、下载相应的jar包 commons-net-1.4.1.jar2、实现代码如下:public class FtpUtils { //ftp服务器地址 public String hostname = "192.168.1.249"; //ftp服务器端口号默认为21 public Integer por...原创 2020-09-25 10:50:26 · 207 阅读 · 0 评论 -
Java NIO原理与简单实现
Java NIO原理与简单实现Java NIO 简介JAVA NIO有两种解释:一种叫非阻塞IO(Non-blocking I/O),另一种也叫新的IO(New I/O),其实是同一个概念。它是一种同步非阻塞的I/O模型,也是I/O多路复用的基础,已经被越来越多地应用到大型应用服务器,成为解决高并发与大量连接、I/O处理问题的有效方式。NIO是一种基于通道和缓冲区的I/O方式,它可以使用...转载 2020-04-09 15:04:41 · 90 阅读 · 0 评论 -
Java实现HTTP协议发送的三种方式
Java实现HTTP请求的三种方式 目前JAVA实现HTTP请求的方法用的最多的有两种:一种是通过HTTPClient这种第三方的开源框架去实现。HTTPClient对HTTP的封装性比较不错,通过它基本上能够满足我们大部分的需求,HttpClient3.1 是 org.apache.commons.httpclient下操作远程 url的工具包,虽然已不再更新,但实现工作中使用httpCl...原创 2020-04-09 11:11:54 · 1126 阅读 · 0 评论 -
MQTT和spring的整合
MQTT和spring的整合(生产者)一,maven依赖<dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-mqtt</artifactId> <versi...原创 2020-02-28 16:50:50 · 2227 阅读 · 2 评论 -
Spring+JMS+ActiveMq整合
3.Spring整合JMS3.1 点对点模式3.1.1消息生产者(1)创建工程springjms_producer,在POM文件中引入SpringJms 、activeMQ以及单元测试相关依赖 1 <dependencies> 2 <dependency> 3 <groupId>org....原创 2020-02-27 11:42:22 · 180 阅读 · 0 评论 -
利用反射解决子父类赋值通用工具类,高效高性能;
利用反射解决子父类赋值通用工具类,高效高性能;一:问题背景例如这种情况扩展类(子类)的父类属性值赋值给基类(父类)时,大量的set和get;1.代码重复,开发起来费时费事;同理,反过来基类(父类)的父类属性值赋值给扩展类(子类)时,也是比较费时费事的;二:解决方式 1.利用反射,将父类的属性赋值给子类; 2.利用反射,将子类的属性赋值给夫类三:总...原创 2020-02-21 15:59:33 · 287 阅读 · 0 评论 -
WebSocket实现后台消息推送
1.什么是WebSocket WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。2.实现原理 在实现websocket连线过程中,需要通过浏览器发出websocket连线请求,然后服务器发出回应,这个过程通常称为“握手” 。在 WebSocket API,浏览器和服务器只需要做一个握手...原创 2019-11-01 14:52:24 · 1411 阅读 · 0 评论