java
农村外出务工男
不创出另一片天地,不删此状态
展开
-
Jdk1.8版本Semaphore实现源码分析
一、Semaphore Semaphore,信号量,常用在限流的场景,一般用来构建一些对象池,资源池之类的,Semaphore用来管理一组许可,当没有许可时,线程阻塞等待其他线程用完后归还许可后阻塞的线程才能获取许可。Semaphore里面分为了公平和非公平模式,默认是非公平的。二、看个例子import java.util.concurrent.CountDownLatch;impor...原创 2018-03-09 13:57:44 · 424 阅读 · 0 评论 -
JAVA的CAS机制
一、什么是CAS CAS即比较并替换,是一种轻量级锁,一般用于并发量不大的场景,CAS机制中用了3个变量:内存值V,旧的预期值A,要修改的新值B;只有当内存中的值和旧的预期值相等的情况下才更新值为B,否则该线程会一直自旋等待,下面我们用大白话来解释CAS。二、CAS 应用 想象一下假如现在我们有2个线程,对共享变量进行i++操作,如果不加锁会出现什么原创 2018-01-22 21:19:34 · 483 阅读 · 0 评论 -
Jdk1.8版本CountDownLatch实现源码分析
一、CountDownLatch CountDownLatch的主要应该场景是,可以用来等待其他线程处理完某个任务后再执行主流程,比如,现在我们有一个运算结果依赖于其它几个线程的运行结果,类似这样的场景就可以考虑用CountDownLatch来实现,CountDownLatch是基于AQS实现的,使用了AQS提供的共享模式。 二、先看一个使用的简单例原创 2018-02-02 08:43:37 · 456 阅读 · 0 评论 -
JAVA实现LRU缓存淘汰
一、缓存淘汰算法 常用的缓存淘汰算法有FIFO,LRU,LFU;最常用的当属于LRU,比如分布式缓存服务memcached其默认的缓存淘汰算法也是LRU;LRU的意思是淘汰最近最少使用的数据,本篇主要采用LinkedHashMap和双向链表来分别实现。二、LinkedHashMap实现 LinkedHashMap用来实现LRU非常简单,LinkedHashma原创 2018-01-26 08:45:26 · 618 阅读 · 0 评论 -
Jdk1.8版本并发包基类AQS(AbstractQueuedSynchronizer)实现原理分析
一、AbstractQueuedSynchronizer是干嘛的? AbstractQueuedSynchronizer(以下简称AQS)是理解JAVA并发包里面各种类使用的一个重要的基础抽象基类,最近也在网上看了一些博客专门讲这个,感觉有些地方没有说清楚,也有一些笔误或者理解的问题,所以自己决定也写一篇。做个笔记,方便以后查阅,如果理解有误的地方,欢迎大家批评指正。原创 2018-01-26 23:14:53 · 560 阅读 · 0 评论 -
JAVA栈-实现字符串反转
一、需求分析 前段时间出去招聘,主要是面向大四学生,问的问题都比较基础,其中也问了一个在网上可以找见的题目,如何实现字符串反转,我发现很多同学都是有一定思路的,比如反向遍历,或者使用stringbuilder.reverse等都可以,然而这里我们要分享的是通过栈来实现。 栈是一种先进后出的数据结构,恰好可以用来实现对字符串的反转操作。二、代码实现 import jav...原创 2018-03-01 08:48:25 · 876 阅读 · 1 评论 -
设计模式之-观察者模式
一、观察者模式 JAVA设计模式有23种,平时工作中也使用了一些,比如单例,模板,策略,建造者等,但最近在学习zk过程中,发现zk提供的发布订阅功能和设计模式里面的观察者模式原理差不多,故顺便了解观察者模式是如何实现的,整体来说比较简单,一个被观察者,N个观察者,当被观察者的行为发生改变的时候,观察者能够监听到这个变化,从而做出相应的行为处理。二、代码实现 这里我们模拟实现一个这...原创 2018-03-01 08:47:24 · 479 阅读 · 0 评论 -
深入分析JAVA线程池的实现原理
一、前言 线程是属于稀缺资源,在应用中,如果频繁的创建销毁线程,势必会造成大量的CPU资源浪费,因此,合理的使用线程池不仅能加快任务处理速度还可以提高资源利用率,本篇主要基于JDK1.8来深入分析JAVA线程池的核心实现原理,由于能力有限,难免会有遗漏或错误的地方,欢迎读者指正。二、Exectors 在JAVA里面,主要是通过Exectors框架来提供了多种...原创 2018-03-09 13:57:24 · 319 阅读 · 0 评论 -
如何将多个java源文件打包成可执行jar包
一、背景 今天在开发中,遇到个问题,我们的应用依赖了一个第三方jar包,于是第三方开发人员就打了个包过来,刚开始一切正常,等开发完了准备放到服务器上跑的时候,启动服务报错了 这个错误以前遇到过,52.0表示是需要Jdk1.8运行的,而我的linux服务器上的jdk版本是1.7(不方便改),所以唯一的解决办法就是让第三方开发人员将java源文件给我自己打包(当然,...原创 2018-03-01 16:58:49 · 10592 阅读 · 0 评论