反射(java) 反射机制就是在程序“运行状态”时:对任意一个类,我们通过反射都能够知道这个类的所有属性和方法;对于任意一个对象,我们同样也都能够调用它的任意一个方法和属性。一、反射的入口想要使用反射,我们必须获取到某一个类的Class对象,java中一共有三种方式可以获取到某个类的Class对象:Class.forName(类的全限定名); 类名.class; 对象.getClass();(getClass()方法是Object类中的一个native方法)下面我们结合代码实例具体的看一下反射的用法。先创建
ReentrantLock入门讲解 一、概述ReentrantLock字面意思就是可重入锁(re表示重新,entrant表示进入,lock表示锁),它其实是属于JUC包(java,util.concurrent)下的一个类。在多线程环境下我们为了避免并发引发的一些问题常常会选择给可能引起并发问题的代码(临界区)加锁,说到加锁大家最熟悉的可能就是synchronized关键字,除此以外的另一个就是ReentrantLock类。ReentrantLock相比于synchronized有如下特点:可中断 可以设置超时时间 可以设置为公平
深入synchronized底层原理 目录一、java对象头二、synchronized底层原理三、synchronized底层原理进阶3.1轻量级锁3.2锁膨张3.3自旋优化3.4偏向锁四、总结一、java对象头在深入了解synchronized底层原理前我们首先要对Java中的对象有一个大体的了解,因为通过synchronized关键字加锁就是给某个对象加的,所以对对象有个大体的了解我们才能更好的深入理解synchronized。在程序中我们new出来的一个对象在内存中通常来说由两部分组成,一个是对.
JVM内存模型(JMM) 目录一、概念二、线程间如何交换数据?一、概念JMM——Java Memeory Model,即Java内存模型,也可以说是JVM内存模型。它的主要作用就是用于定义变量的访问规则。这里的变量是指所有线程可以共享的变量,比如成员变量,不能是局部变量。因为局部变量(在方法内)是放在栈中的,而每个线程都有属于自己的栈,所以局部变量不是线程共享的。JMM将内存划分为两个区:主内存区和工作内存区。可能这里你会问内存空间不是分为堆、栈、方法区等这些区域吗?其实都没有错,只是从不同的角度进心的划分而已。
创建线程的三种方式 我们平常接触比较多的创建线程的方式一般有两种,第三种接触的比较少,之前去京东面试被问到过,自己太菜,直接就懵逼了,第三种方式完全不知道,现在统一做个总结。目录一、方式一:继承Thread类二、方式二:实现Runnable接口三、Callable加FutureTask方式一、方式一:继承Thread类这种方式就是我们自己创建一个类然后继承Thread,并覆写Thread中的r...
Java中的四种引用类型 大家对Java中的四种引用类型相信都不陌生,都知道这四种应用类型分别是强引用(Strongly Reference)、软引用(Soft Reference)、弱引用(Weak Refrence)和虚引用(Phantom Reference)。但也好像再具体一点就有点模糊了,比如jdk为什么要设计这四种引用类型?既然设计了它肯定就会有对应的引用场景等等。我本人之前对这些的了解也是知道有这么个东西,再...
线程的几种通信方式 目录一、Object的wait()、notify()、notifyAll()方法二、Condition的await()、signal()、signalAll()方法三、CountDownLatch四、CyclicBarrier五、Semaphore线程间的通信方式常用的有如下几种:Object的wait()、notify()、notifyAll()方法;Condi...
利用cronlog 切割tomcat日志文件(非root用户) 引言:公司项目部署在tomcat上,随着时间的推移,tomcat/logs下的日志文件catalina.out会越来越大。如下图所示,是我们公司的项目日志文件,大家可以看到catalina.out已经有5.2G这么大了。为了避免日志文件不断的增大下去,前段时间利用cronlog对日志文件做了切割,切割以后日志文件就会每天单独生成一个,而不会都堆积到一个catalina.out中。本文适用于to...
RabbitMQ(三)——Spring 整合RibbitMQ 经过前面两节关于RabbitMQ的简单介绍,我们发现不管是消费端还是生产端,每次都需要编写大量重复的代码,这显然不是我们想要,那么本节就介绍spring和RabbitMQ的整合,它可以帮我们减少许多代码的编写,实际项目中也经常用到。一、搭建SpringBoot环境还记得我们在RabbitMQ(一)——入门中的入门程序中介绍的内容吗?当时我们在pom.xml文件中引入的RabbitMQ的依赖...
RabbitMQ(二)——RabbitMQ的工作模式 在RabbitMQ(一)——入门中我们简单的介绍了一下RabbitMQ的入门知识,这节我们针对RabbitMQ的几种常见的工作模式展开来讲解一下。RabbitMQ有以下几种工作模式 :目录一、简单模式二、工作队列模式三、发布/订阅模式四、路由模式五、主题模式六、Header模式七、RPC模式一、简单模式这种模式是RabbitMQ中最简单的一种工作模式,我们在...
RabbitMQ(一)——入门 前言原来公司项目的消息中间件一直在用RabbitMQ,今天抽出时间简单总结梳理一下关于RabbitMQ的相关知识点。我们知道消息队列在分布式系统中应用的的地方有很多,它也有很多种类型,除了今天重点介绍的RabbitMQ,还有像ActiveMQ,阿里的RocketMQ,在大数据场景中经常用到的Kafka,还有一些其他的诸如ZeroMQ,MetaMQ等等。ActiveMQ在之前其实一直很火,许多公...
MySQL(六)——存储过程和存储函数 前言 今天简单的介绍一下“存储函数”和“存储过程”,平时在工作中用到的时间不多,时间长了难免会忘记。在这里简单的做个回忆总结,方便自己以后复习回忆,当然能帮到需要的同学那就更好了。 关于MySQL中的存储过程/函数可以类比我们java中的方法进行理解,它们都是对一些经常要用到的代码打包封装到一个方法中,在需要用到的地方直接调用方法名就可以了,这样就省去了很多重复代码的编...
MySQL(五)——MySQL中的变量 在mysql文档中,mysql变量可分为两大类,即系统变量和用户变量。但根据实际应用又被细化为四种类型,即局部变量、用户变量、会话变量和全局变量。一、局部变量mysql局部变量,只能用在begin/end语句块中,比如存储过程中的begin/end语句块。其作用域仅限于该语句块。-- declare语句专门用于定义局部变量,可以使用default来说明默认值declare ...
MySQL(四)——SQL常见优化手段及如何避免索引失效 在MySQL(三)——SQL执行计划分析这篇文章中具体介绍了一下SQL执行计划中各个字段的含义,今天这篇文章就简单的说一说具体的优化手段吧。一、SQL优化在做具体的总结之前,为了便于理解,先拿一个具体的例子的简单的实际操作一下具体的SQL优化过程。先创建一张book表(有图书编号、书名、作者、出版编号、类型编号四个字段),并随便插入几条数据:create table book(...
MySQL(三)——SQL执行计划分析 目录一、SQL执行计划概述二、explain字段详解 1.id 2.select_type 3.possible_keys 4.key 5.key_len 6.ref 7.rows 8.Extral一、SQL执行计划概述我们在上一节MySQL(二)——MySQL的逻辑分层-存储引擎-SQL优化中的最后...
Linux下安装JDK 1.查看当前系统是否已经安装了Java 输入 命令:rpm -qa|grep java 发现有两个版本的Java已经安装了2.卸载掉已经安装的Java 输入命令:rpm -e --nodeps 软件名3.上传已经下载好的jdk到Linux中的某个目录 下载地址:https://www.oracle.com/technetwork/java...