
jdk
weixin_43770982
这个作者很懒,什么都没留下…
展开
-
并发系列(3)之 CLH、MCS 队列锁简介
一、自旋锁简介通常情况下解决多线程共享资源逻辑一致性问题有两种方式:互斥锁:当发现资源被占用的时候,会阻塞自己直到资源解除占用,然后再次尝试获取; 自旋锁:当发现占用时,一直尝试获取锁(线程没有被挂起的过程,也就没有线程调度切换的消耗);对于这两种方式没有优劣之分,只有是否适合当前的场景。但是如果竞争非常激烈的时候,使用自旋锁就会产生一些额外的问题:可能导致一些线程始终无法获取...原创 2019-04-27 16:37:15 · 175 阅读 · 0 评论 -
SSM(三)Shiro使用详解
前言相比有做过企业级开发的童鞋应该都有做过权限安全之类的功能吧,最先开始我采用的是建用户表,角色表,权限表,之后在拦截器中对每一个请求进行拦截,再到数据库中进行查询看当前用户是否有该权限,这样的设计能满足大多数中小型系统的需求。不过这篇所介绍的Shiro能满足之前的所有需求,并且使用简单,安全性高,而且现在越来越的多企业都在使用Shiro,这应该是一个收入的你的技能库。创建自定义MyRea...原创 2019-06-19 14:53:05 · 143 阅读 · 0 评论 -
揭开java内存模型的神秘面纱
java并发采用的是共享内存模型,线程之间的通信对程序员来说是透明的,内存可见性问题很容易困扰着java程序员,今天我们就来揭开java内存模型的神秘面纱。在揭开面纱之前,我们需要认识几个基础概念:内存屏障(memory Barriers),指令重排序,happens-before规则,as-if-serial语义。什么是 Memory Barrier(内存屏障)?内存屏障,又称内存...原创 2019-06-14 16:33:33 · 102 阅读 · 0 评论 -
( 十二)ThreadPoolExecutor线程池原理及其execute方法
jdk1.7.0_79 对于线程池大部分人可能会用,也知道为什么用。无非就是任务需要异步执行,再者就是线程需要统一管理起来。对于从线程池中获取线程,大部分人可能只知道,我现在需要一个线程来执行一个任务,那我就把任务丢到线程池里,线程池里有空闲的线程就执行,没有空闲的线程就等待。实际上对于线程池的执行原理远远不止这么简单。 在Java并发包中提供了线程池类——ThreadPoolExe...原创 2019-06-03 17:31:37 · 277 阅读 · 0 评论 -
Java:比较与排序
1.两种比较接口分析在“集合框架”中有两种比较接口:Comparable接口和Comparator接口。Comparable是通用的接口,用户可以实现它来完成自己特定的比较,而Comparator可以看成一种算法的实现,在需要容器集合实现比较功能的时候,来指定这个比较器,这可以看成一种设计模式,将算法和数据分离。前者应该比较固定,和一个具体类相绑定,而后者比较灵活,它可以被用于各个需要比较...原创 2019-06-19 19:05:49 · 447 阅读 · 0 评论 -
java lambda方法引用总结——烧脑吃透
lambda是java8的新特性,基本使用比较容易理解,但有一个环节遇到了坎儿,那就是方法引用,尤其是类的实例方法引用,烧脑之后总结一下。在需要函数参数的方法中,我们可以把另一个同类型的方法直接传入,这称为方法引用的绑定。类似于C语言中的函数指针。lambda表达式可以替代方法引用;或者说方法引用是lambda的一种特例,方法引用不可以控制传递参数。4.1) 构造器引用priva...原创 2019-06-20 16:01:32 · 1029 阅读 · 0 评论 -
Java泛型总结
什么是泛型泛型是jdk5引入的类型机制,就是将类型参数化,它是早在1999年就制定的jsr14的实现。泛型机制将类型转换时的类型检查从运行时提前到了编译时,使用泛型编写的代码比杂乱的使用object并在需要时再强制类型转换的机制具有更好的可读性和安全性。泛型程序设计意味着程序可以被不同类型的对象重用,类似c++的模版。泛型对于集合类尤其有用,如ArrayList。这里可能有疑问,既...原创 2019-06-16 17:34:01 · 207 阅读 · 0 评论 -
一次 HashSet 所引起的并发问题
背景上午刚到公司,准备开始一天的摸鱼之旅时突然收到了一封监控中心的邮件。心中暗道不好,因为监控系统从来不会告诉我应用完美无bug,其实系统挺猥琐。打开邮件一看,果然告知我有一个应用的线程池队列达到阈值触发了报警。由于这个应用出问题非常影响用户体验;于是立马让运维保留现场dump线程和内存同时重启应用,还好重启之后恢复正常。于是开始着手排查问题。分析首先了解下这个应用大...原创 2019-06-25 11:12:41 · 178 阅读 · 0 评论 -
SSM(五)基于webSocket的聊天室
前言不知大家在平时的需求中有没有遇到需要实时处理信息的情况,如站内信,订阅,聊天之类的。在这之前我们通常想到的方法一般都是采用轮训的方式每隔一定的时间向服务器发送请求从而获得最新的数据,但这样会浪费掉很多的资源并且也不是实时的,于是随着HTML5的推出带来了websocket可以根本的解决以上问题实现真正的实时传输。websocket是什么?至于websocket是什么、有什么用这样的...原创 2019-06-22 11:56:43 · 310 阅读 · 0 评论 -
SSM(二)Lucene全文检索
前言大家平时肯定都有用过全文检索工具,最常用的百度谷歌就是其中的典型。如果自己能够做一个那是不是想想就逼格满满呢。Apache就为我们提供了这样一个框架,以下就是在实际开发中加入Lucene的一个小Demo。获取Maven依赖首先看一下实际运行的效果图:这个项目是基于之前使用IDEA搭建的SSM的基础上进行增加的,建议小白先看一下我上一篇博客。以下是Lucene所需要的依赖:...原创 2019-06-18 14:33:36 · 198 阅读 · 0 评论 -
深入分析String.intern和String常量的实现原理
背景字符串类型在实际应用场景中使用非常频繁,如果为每个字符串常量都生成一个对应的String对象,明显会造成内存的浪费,针对这一问题,虚拟机实现一个字符串常量池的概念,提供了如下实现:1、同一个字符串常量,在常量池只有一份副本;2、通过双引号声明的字符串,直接保存在常量池中;3、如果是String对象,可以通过String.intern方法,把字符串常量保存到常量池中;本文JVM源码...原创 2019-06-14 14:49:43 · 136 阅读 · 0 评论 -
探讨Java内部类的可见性
在Java中,当生成一个内部类的对象时,此对象与制造它的外部类通过外部类的.this保持着联系,因此该内部类对象可以访问其外部类对象的所有成员,包括private成员。而该内部类对象对于其他类的对象的访问,遵照常规的访问权限语法,这一点也没有什么特别支持。这里需要探讨的是,外部类以及其他类的对象可以如何访问到某个内部类对象,即内部类的可见性问题。下面是一个示例程序Out.java,其中包含...原创 2019-06-13 14:28:42 · 476 阅读 · 0 评论 -
并发系列(5)之 Future 框架详解
本文将主要讲解 J.U.C 中的 Future 框架,并分析结合源码分析其内部结构逻辑;一、Future 框架概述JDK 中的 Future 框架实际就是 Future 模式的实现,通常情况下我们会配合线程池使用,但也可以单独使用;下面我们就单独使用简单举例;1. 应用实例FutureTask<String> future = new FutureTask&l...原创 2019-05-05 14:31:26 · 199 阅读 · 0 评论 -
并发系列(4)之 AbstractQueuedSynchronizer 源码分析
本文将主要讲述AbstractQueuedSynchronizer的内部结构和实现逻辑,在看本文之前最好先了解一下CLH队列锁,AbstractQueuedSynchronizer就是根据CLH队列锁的变种实现的,因为本身AQS比较复杂不容易看清楚他本身的实现逻辑,所以查看CLH队列锁的实现,可以帮助我们理清楚他内部的关系;关于队列锁的内容可以参考 ,CLH、MCS 队列锁简介...原创 2019-04-30 16:46:48 · 187 阅读 · 0 评论 -
并发系列(6)之 ThreadPoolExecutor 详解
本文将主要介绍我们平时最常用的线程池ThreadPoolExecutor,有可能你平时没有直接使用这个类,而是使用Executors的工厂方法创建线程池,虽然这样很简单,但是很可能因为这个线程池发生OOM,具体情况文中会详细介绍;二、ThreadPoolExecutor 概览ThreadPoolExecutor的继承关系如图所示:其中:Executor:定义了...原创 2019-05-06 16:25:20 · 187 阅读 · 0 评论 -
并发系列(7)之 ScheduledThreadPoolExecutor 详解
文本将主要讲述ThreadPoolExecutor一个特殊的子类ScheduledThreadPoolExecutor,主要用于执行周期性任务;所以在看本文之前最好先了解一下ThreadPoolExecutor,可以参考ThreadPoolExecutor 详解。一、ScheduledThreadPoolExecutor 结构概述1. 继承关系public cla...原创 2019-05-07 17:31:47 · 645 阅读 · 1 评论 -
( 九)并发包非阻塞队列ConcurrentLinkedQueue
jdk1.7.0_79 队列是一种非常常用的数据结构,一进一出,先进先出。 在Java并发包中提供了两种类型的队列,非阻塞队列与阻塞队列,当然它们都是线程安全的,无需担心在多线程并发环境所带来的不可预知的问题。为什么会有非阻塞和阻塞之分呢?这里的非阻塞与阻塞在于有界与否,也就是在初始化时有没有给它一个默认的容量大小,对于阻塞有界队列来讲,如果队列满了的话,则任何线程都会阻塞不能进行...原创 2019-05-30 11:05:40 · 187 阅读 · 0 评论 -
JDK版本不兼容问题之:一台机器安装多个版本的JDK
我的机器上最开始安装的是jdk1.6,后来因为工作需要又安装了jdk1.4。但是,环境变量我并未更改,还是指向jdk1.6的路径的。可是,在cmd窗口输入 java -version 却得到是1.4.2。查询环境变量:1.我的电脑->属性->高级->环境变量2. 系统环境变量(HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Con...原创 2019-05-27 19:37:14 · 305 阅读 · 0 评论 -
( 十三)ThreadPoolExecutor线程池之submit方法
jdk1.7.0_79 在上一篇《ThreadPoolExecutor线程池原理及其execute方法》中提到了线程池ThreadPoolExecutor的原理以及它的execute方法。本文解析ThreadPoolExecutor#submit。 对于一个任务的执行有时我们不需要它返回结果,但是有我们需要它的返回执行结果。对于线程来讲,如果不需要它返回结果则实现Runnable,而...原创 2019-06-05 16:56:08 · 344 阅读 · 0 评论 -
( 十)并发包阻塞队列之ArrayBlockingQueue
jdk1.7.0_79 上一节中对并发包中的非阻塞队列ConcurrentLinkedQueue的入队、出队做了一个简要的分析,本文将对并发包中的阻塞队列做一个简要分析。 Java并发包中的阻塞队列一共7个,当然他们都是线程安全的。 ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列。 LinkedBlockingQueue:一个由链表结构组成的...原创 2019-05-31 16:38:39 · 151 阅读 · 0 评论 -
( 十一)并发包阻塞队列之LinkedBlockingQueue
jdk1.7.0_79 在上文《并发包阻塞队列之ArrayBlockingQueue》中简要解析了ArrayBlockingQueue部分源码,在本文中同样要介绍的是Java并发包中的阻塞队列LinkedBlockingQueue。ArrayBlockingQueue队列是由数组实现,而LinkedBlockingQueue队列的实现则是链表(单向链表)实现,所以在LinkedBlocki...原创 2019-06-01 14:44:20 · 203 阅读 · 0 评论 -
(十四)Java中的Future模式
jdk1.7.0_79 本文实际上是对上文《ThreadPoolExecutor线程池之submit方法》的一个延续或者一个补充。在上文中提到的submit方法里出现了FutureTask,这不得不停止脚步将方向转向Java的Future模式。 Future是并发编程中的一种设计模式,对于多线程来说,线程A需要等待线程B的结果,它没必要一直等待B,可以先拿到一个未来的Future,等...原创 2019-06-06 17:02:13 · 130 阅读 · 0 评论 -
maven 中配置多个mirror的问题
有个小伙伴遇到一个疑问:他的工作笔记本,在公司用部门搭建的maven私服做镜像,回到家用aliyun的镜像,每次都要改配置文件,很麻烦,希望能够不改动配置文件的情况下,动态切换mirror配置。我们知道 settings.xml 中可以使用变量,可以尝试使用变量解决。<mirrors> <mirror> <id>aliyun</id&...原创 2019-06-18 19:26:20 · 19988 阅读 · 0 评论