![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java基础
有头发的猩猩
这个作者很懒,什么都没留下…
展开
-
什么是公平锁和非公平锁,基于Lock
非公平锁:首先会在 lock方法调用加锁的时候去抢锁(公平锁调用lock不会上来就去拿锁)如果加锁失败则去看为什么失败(是否锁被人持有),在判断的时候如果锁没有被人持有非公平锁就会直接去加锁(不会判断是否有人排队),成果则进入同步块,失败则park(真正的排队)公平锁:第一次加锁的时候,他不会去尝试加锁,它回去看一下前面有没有人排队没如果有人排队,则进入队列(并不等于排队),然后还不会立刻等待,还会再次看一下有没有拿锁的资格(前面的元素是否为 head),如果有资格(前面那个人正好是h.原创 2020-09-08 17:09:06 · 587 阅读 · 0 评论 -
Java 方法调用的底层实现
详细内容请移驾我的个人博客品尝:http://www.19971001.com/article/33我们写的代码,经过编译、经过类加载的各种阶段,进入了JVM的运行时数据区。但作为程序员真正关心的是代码的执行,代码的执行其实本质上市方法的执行,站在JVM 的角度归根到底还是字节码的执行。main 函数式 JVM指令执行的起点,JVM 会创建 main线程来执行main函数,以触发JVM一系列指令的执行,真正的把 JVM 跑起来。接着,在我们的代码中,就是方法的调用过程,所以了解方法在 JVM .原创 2020-08-04 11:24:25 · 2029 阅读 · 0 评论 -
锁:可重入式独占锁
什么是可重入锁(ReentrantLock)? 线程可以重复进入任何一个它已经拥有的锁所同步着的代码块,synchronized、ReentrantLock都是可重入的锁。在实现上,就是线程每次获取锁时判定如果获得锁的线程是它自己时,简单将计数器累积即可,每释放一次锁,进行计数器累减,直到计算器归零,表示线程已经彻底释放锁。项目示例:https://gitee.com/...原创 2019-12-17 16:29:26 · 280 阅读 · 0 评论 -
缓存穿透、击穿、雪崩缓存场景分析及解决方案
由于 CSDN 改版之后导致页面丢失了太多的东西,现已将博客迁移到自己的小站去了:地址:http://www.wangchunlong.cn/article/8 使用缓存通常的操作时先访问缓存数据,如果缓存中不存在的话,就会回源到数据库中然后将数据写入到缓存中。如果存在就直接返回数据,从整个过程来看,缓存层就处于数据库的前置环节,分担了数据库在高并发容易出现故障的风...原创 2019-12-13 17:05:35 · 658 阅读 · 0 评论 -
缓存领域常用术语
由于博客迁移,已经放在了自己的小站上了详细地址:http://www.wangchunlong.cn/article/7在合理应用缓存前,需要了解缓存领域里相关的几个常用术语:1.1、 缓存命中:表示数据能够从缓存中获取,不需要回源1.2、 Cache miss(缓存没有命中) :表示没有命中缓存,如果缓存内存中还有内存空间的话,会将数据加入到缓存中1.3、 存储成本: ...原创 2019-12-13 16:00:43 · 335 阅读 · 0 评论 -
maven打包 Failed to execute goal on project XX: Could not resolve dependencies for project 问题
将一个新项目打包为 Jar 上线时发生了这个错误Failed to execute goal on project mayimq-client: Could not resolve dependencies for project cn.wangchunlong:mayimq-client:jar:1.0: The following artifacts could not be resol...原创 2019-10-17 14:31:32 · 1754 阅读 · 0 评论 -
spring项目启动完成后,自动执行一次指定方法
实现ApplicationListener接口,并实现 onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent)方法@Componentpublic class SearchReceive implements ApplicationListener<ContextRefreshedEvent> {...原创 2019-09-19 14:54:54 · 685 阅读 · 0 评论 -
JVM会在什么时候会发生内存泄漏、触发GC回收
第一个问题,Java在什么时候容易发生内存泄露? 1、静态集合类,如 HashMap、Vector 等,因为GC是不会回收静态类的 2、各种连接,如 数据库连接、网络连接、IO连接等如果没有调用 close 关闭,GC不会回收导致的内存泄露,所以我们一再强调使用完连接之后一定要在 finally 中关闭掉 3、强引用,Object obj = new O...原创 2019-08-23 15:38:09 · 1868 阅读 · 0 评论 -
JVM 垃圾回收器
分代收集:根据各个年代的特点选取不同的垃圾回收算法 新生代使用复制算法 老年代使用标记-整理或者标记-清除算法 jps -v 显示当前使用的垃圾回收器 在新生代中,每次垃圾收集是都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集,而老年代中因为对象存活率高、没有额外空间对它进行...原创 2019-08-16 17:37:20 · 133 阅读 · 0 评论 -
JVM GC垃圾回收机制及算法
1、GC 1.1 Minor GC 特点:发生在新生代上,发生的较频繁,执行速度较快 触发条件:Eden 区空间不足 \ 空间分配担保 1.2 Full GC 特点:主要发生在老年代上(新生代也会回收),较少发生,执行速度较慢 ...原创 2019-08-16 16:20:45 · 171 阅读 · 0 评论 -
Java获取 IP 详细信息、经纬度
可以自己搭建,也可以直接使用现成的请求链接,每个月月初更新 ip 库 获取城市信息:http://ip.guoxinqi.cn/city/47.96.229.169 获取IP经纬度信息:http://ip.guoxinqi.cn/position/47.96.229.169自己搭建:可用于拦截操作、获取 IP 详细信息、及黑名单操作获取。拦截操作: MvcCon...原创 2019-08-14 19:57:22 · 1005 阅读 · 0 评论 -
关于volatile关键字详解
提到volatile首先想到就是:保证此变量对所有线程的可见性,这里的 “可见性”是指当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的。 禁止指令重排序优化(happens-before)。1、特性 可见性:对一个volatile 变量的读,总是能看到(任意线程) 对这个 volatile 变量最后的写入。 原子性:对任意单个 volati...原创 2019-07-28 15:34:02 · 138 阅读 · 0 评论 -
new HashMap()和Maps.newHashMap()的区别以及 newHashMapWithExpectedSize()
1、new HashMap() 这种是java原生API写法,需要你手动加泛型。存在线程安全问题,在扩容计算hash的时候会出现安全问题,在rehash方法中,有兴趣的可以去看一下源码Map<String,Object>result=newHashMap<String,Object>(); 2、Maps.newHashM...原创 2019-07-25 18:26:17 · 3444 阅读 · 0 评论 -
OutputStream、 OutputStreamWriter、 BufferedWriter区别及使用
源码地址:https://gitee.com/qq1319426493/io/tree/master1、OutputStream,OutputStreamWriter,BufferedWriter区别1.1、OutputStream:表示输出字节流所有类的超类。输出流接受输出字节并将它们发送到某个接收器。一般我们使用它的子类,如FileOutputStream等.1.2、OutputS...原创 2018-11-13 10:42:04 · 12666 阅读 · 2 评论 -
InputStream 、 InputStreamReader 、 BufferedReader区别及使用
源码地址:https://gitee.com/qq1319426493/io/tree/master1、InputStream、OutputStream区别 1.1)InputStream:是表示输入字节流所有类的超类,一般我们使用它的子类,如FileInputStream等.import java.io.FileInputStream;public class Inp...原创 2018-11-12 16:07:38 · 7648 阅读 · 0 评论 -
(非常非常重要)Java基础之反射
反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码))一、反射的概述JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。要想解剖一个类,必须先要获取到该类的字节码...转载 2018-12-03 20:42:31 · 711 阅读 · 0 评论 -
Java利用反射动态获取参数并进行操作实例,实现动态获取实体类解析JSON
今天看到程序里面有大量数据都是使用的JSON传输,解析重复代码太多了,然后重构了解析JSON的方式,利用反射机制把解析的方式封装了一下,我这是使用的FastJson,使用其他JSON的自己改一下就可以了import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect....原创 2018-12-19 20:45:41 · 3172 阅读 · 0 评论 -
JavaWeb获取客户端ip
public static String getIpAddr(HttpServletRequest request) { if (request == null) { return "unknown"; } String ip = request.getHeader("x-forwarded-for"...原创 2018-12-14 14:56:20 · 537 阅读 · 0 评论 -
Java获取服务器IP、MAC地址
@Resource private WebServiceContext webServiceContext; public String getLoginUser() throws Exception { InetAddress ip; try { ip = InetAddress.getLocalHost(); ...原创 2018-12-15 12:38:42 · 1225 阅读 · 1 评论 -
JMM基础-计算机原理
Java内存模型即 Java Memory Model,简称JMM。JMM 定义了 Java 虚拟机(JVM)在内存中的工作方式。JVM 是整个计算机虚拟模型,所以JMM 是隶属于 JVM 的。Java1.5版本对其进行了重构,现在的Java仍沿用了 Java1.5的版本,JMM 遇到的问题与现代计算机中遇到的问题是差不多类似的。 物理计算机中的并发问题,物理...原创 2019-06-10 17:49:38 · 175 阅读 · 0 评论 -
JMM基础-伪共享
CPU中存在好几级的高速缓存。但是CPU 缓存中是以 缓存行 为单位存储的。目前主流的 CPU Cache 的Cache Line 大小都是 64Bytes。Cache Line 可以简单的理解为 CPU Cache中的最小缓存单位,今天的 CPU不再是按字节访问内存,而是以 64 字节为单位的块(chunk)拿取,成为一个缓存行(Cache Line)。当你读一个特定的内存地址,...原创 2019-06-10 18:04:46 · 448 阅读 · 0 评论 -
JMM基础-内存模型及内存模型带来的问题
内存模型 从抽象的角度来看,JMM 定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(Main Memory)中,每个线程都有一个私有的本地内存(Local Momory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是 JMM 的一个抽象概念,并不真实存在。它涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编辑器优化。Java...原创 2019-06-11 14:44:18 · 370 阅读 · 0 评论 -
常用的正则表达式
一、校验数字的表达式 1 数字:^[0-9]*$ 2 n位的数字:^\d{n}$ 3 至少n位的数字:^\d{n,}$ 4 m-n位的数字:^\d{m,n}$ 5 零和非零开头的数字:^(0|[1-9][0-9]*)$ 6 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$ 7 带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?$ 8 ...原创 2018-05-17 09:19:29 · 312 阅读 · 0 评论