自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

三劫散仙

有问题关注微信公众号:我是攻城师(woshigcs)

原创 记一次log4j不打印日志的踩坑记

起因 前几天一个跑有java应用的生产集群(200多台物理机)升级了一个版本,重启后发现约有50台机器日志不能正常输出,但其程序确能正常的运行,在生产环境中,日志是非常重要的一个监控手段,如果没有日志输出,无疑是非常危险的。 排查 & 解决 发现这一情况后,立即开始从jdk环境和版本...

2019-09-22 02:00:25 182 0

原创 最近学车的一点经验

https://mp.weixin.qq.com/s?__biz=MzAxMzE4MDI0NQ==&mid=2650336733&idx=1&sn=7f89fd6d1f81741f77f4b65576c06812&chksm=83aac1e7b4dd48f1da09...

2019-08-28 22:59:20 327 1

原创 在Java里面如何解决进退两难的jar包冲突问题?

如上图所示: es api组件依赖guava18.0,spark项目由于业务需要写入es所以需要依赖es ,但spark项目的环境又需要依赖guava14.0,如果换成高版本可能会报错,这个决定了你不能都使用统一的低版本或者高版本来规避此问题,因此必须面对现实。 导致异常的原因简单说下: s...

2019-07-23 19:14:47 632 0

原创 什么是操作系统的虚拟内存?

https://mp.weixin.qq.com/s?__biz=MzAxMzE4MDI0NQ==&mid=2650336679&idx=1&sn=1b727d7ddc6c069627d7b8fbb444aaf4&chksm=83aac19db4dd488b5186...

2019-07-17 10:07:53 689 0

原创 复盘一个Elasticsearch排序问题的剖析

最近线上的es查询的某个微服务接口,报了一个异常,如下: nested: SearchParseException[No mapping found for [count] in order to sort on]; Caused by: SearchParseException[failed...

2019-07-15 21:13:58 213 0

原创 如何轻松理解二叉树的深度遍历策略

我们知道普通的线性数据结构如链表,数组等,遍历方式单一,都是从头到尾遍历就行,但树这种数据结构却不一样,我们从一个节点出发,下一个节点却有可能遇到多个分支路径,所以为了遍历树的全部节点,我们需要借助一个临时容器,通常是栈这种数据结构,来存储当遇到多个分叉路径时的,存暂时没走的其他路径,等走过的路径...

2019-07-03 23:40:24 296 0

原创 深入理解什么是LSM-Tree

前言 十多年前,谷歌发布了大名鼎鼎的"三驾马车"的论文,分别是GFS(2003年),MapReduce(2004年),BigTable(2006年),为开源界在大数据领域带来了无数的灵感,其中在 “BigTable” 的论文中很多很酷的方面之一就是它所使用的文件组织方式,这个...

2019-05-21 20:03:23 2710 1

原创 18个高效使用Google搜索的技巧

前言 如果把浩瀚的互联网资源比喻成是一个图书馆,那么google搜索引擎毫无疑问是这个图书馆的导航中心,通过google可以轻而易举得检索到绝大多数你需要的资料,然而大多数人可能并没有充分发挥谷歌搜索的潜力。 如何才能更加高效,快速的利用好谷歌这个搜索引擎呢?这里有18个技巧用来提升你的检索效...

2019-03-22 19:58:23 1065 0

原创 Apache Flink在阿里的使用(译)

Flink是未来大数据实时数据处理领域的首选框架,本文原文是阿里巴巴的搜索团队总监Xiaowei Jiang在Flink Forward 2016大会上分享的内容,后来被记录并移到Flink公司官网的Blog上(注意这个不是社区的官网,原名叫data Artisans,被阿里收购后改为verv...

2019-02-21 21:21:21 898 0

原创 为什么单线程Redis性能也很出色

高性能的服务器,不一定是多线程实现的,也就是说多线程不一定比单线程效率高,这得分具体的情况。以redis为例,核心处理请求的线程只有一个,所以我们常常理解其仅仅只有一个线程,但准确来说其实并不是单线程的,比如日志的备份需要单独的fork一个进程或者线程去做备份等,那么redis何来单线程还能达到...

2019-01-21 18:00:47 345 0

原创 如何扩展python的logging组件支持json日志输出

这两天在优化公司一个python的项目,顺便研究了一下如何将python日志转成json格式,原来在Java的项目中搞过类似的事情,知道日志转成json之后有很多便利的之处,最常见的就是可以直接对接各种日志分析系统,如开源的ELK,将数据导入之后就能快速的进行查询和分析,方便做各种统计,监控或报警...

2019-01-10 21:54:58 1383 1

原创 为什么Java里面String类是不可变的

在Java里面String类型是不可变对象,这一点毫无疑问,那么为什么Java语言的设计者要把String类型设计成不可变对象呢?这是一个值得思考的问题 Java语言的创建者James Gosling,曾经在一次采访中被人问到:什么时候应该使用不可变对象(immutable object),他回...

2019-01-06 18:39:28 1216 1

原创 关于Java里面volatile关键字的重排序

Java里面volatile关键字主要有两个作用: (1)可见性 (2)禁止指令重排序 第一条可见性比较容易理解,就是使用volatile修饰的共享变量,如果有一个线程修改了值,其他的线程里面是立即可见的。原理是对volatile变量的读写,都会强制线程操作从主内存。 第二条禁止指令重排序...

2019-01-04 18:44:57 338 0

原创 操作系统之CPU知识扫盲

(上图是一个拥有两个物理cpu的主板电路,图片来源于网络) 前言 CPU的英文全称是(Central Processing Unit),中文意思翻译中央处理器,是计算机的主要设备之一,功能主要是解释计算机指令以及处理计算机软件中的数据。计算机的可编程性主要是指对中央处理器的编程。 关于冯·诺...

2018-12-22 13:58:42 352 0

原创 关于Linux进程的基础知识

前言 在计算机里面,一个进程通常指的是一个运行程序的实例,它包含程序代码和其活动。依赖于具体的操作系统,一个进程启动后通常由若干个线程组成,多个线程可以同时并发的执行程序的指令,进程里面第一个启动的线程,通常称为主线程。 进程的类型 前台进程 通常也指交互进程,这些进程一般都是通过linu...

2018-12-17 16:04:18 116 0

原创 多个线程如何轮流打印ABC特定的次数?

之前的一篇文章,我给出了关于多线程应用的几个例子: 都是基于Java里面Lock锁实现的,分别是: (1)两个线程轮流打印奇数和偶数 (2)多个线程模拟买票 (3)模拟生产者消费者 今天再抛砖引玉,思考一下如何在多个线程中,轮流打印特定顺序的信息多少次。 这类问题其实并不难,只要掌握了...

2018-12-11 20:43:50 371 0

原创 再谈方法调用与堆栈

再谈方法调用与堆和栈 在JVM里面,最重要的两个运行时数据区,无非就是堆和栈了。 关于堆 堆内存是被多个线程共享的,而栈内存是线程私有的。堆主要用来存储运行时所有的对象数据和各种数组,简单点说通过new创建的实例,都会在堆上分配空间。堆在虚拟机启动时创建,并且堆具有自动垃圾回收的功能,在Ja...

2018-11-17 14:20:15 432 0

原创 聊聊Java里面的引用传递

聊聊Java里面的"引用传递" 长久以来,在Java语言里面一直有一个争论,就是Java语言到底是值传递(pass-by-value)还是引用传递(pass-by-reference),有的人说是值传递,有的人说是引用传递,两边各执一词,从而误导了很多开发者,更有甚者告诉开发...

2018-11-16 21:33:46 105 0

理解计数排序算法的原理和实现

计数排序(Counting sort)是一种稳定的线性时间排序算法,其平均时间复杂度和空间复杂度为O(n+k),其中n为数组元素的个数,k为待排序数组里面的最大值。同样具有线性时间排序的算法还有桶排序和基数排序,这一点不要搞混。 计数排序不是基于比较的排序,所以它的排序效率是线性的,...

2018-10-11 10:03:34 319 0

原创 理解计数排序算法的原理和实现

计数排序(Counting sort)是一种稳定的线性时间排序算法,其平均时间复杂度和空间复杂度为O(n+k),其中n为数组元素的个数,k为待排序数组里面的最大值。同样具有线性时间排序的算法还有桶排序和基数排序,这一点不要搞混。 计数排序不是基于比较的排序,所以它的排序效率是线性的,在特定的场景...

2018-10-11 09:57:47 139 0

原创 深入理解Java类加载器机制

前言 Java里面的类加载机制,可以说是Java虚拟机核心组件之一,掌握和理解JVM虚拟机的架构,将有助于我们站在底层原理的角度上来理解Java语言,这也是为什么我们学习一个新的知识时,如果不理解原理全靠死记硬背,我相信过不了几天便会忘记的一干二净。 Java是一门跨平台的语言,而JVM虚拟机...

2018-09-25 10:06:24 526 0

原创 理解Java并发工具包线程池的设计

为什么需要线程池? 答:主要原因是因为创建一个线程开销太大,尤其是对大量的小任务需要执行这种场景。 在Java里面创建一个线程,需要包含的东西: (1)它为一个线程堆栈分配内存,该堆栈为每个线程方法调用保存一个帧 (2)每个帧由局部变量数组,返回值,操作数栈,常量池组成 (3)某些JVM...

2018-09-12 21:25:58 910 0

理解Java7和8里面HashMap+ConcurrentHashMap的扩容策略

### 前言 理解HashMap和ConcurrentHashMap的重点在于: (1)理解HashMap的数据结构的设计和实现思路 (2)在(1)的基础上,理解ConcurrentHashMap的并发安全的设计和实现思路 前面的文章已经介绍过Map结构的底层实现,这里我们...

2018-09-06 11:31:21 133 0

原创 理解Java7和8里面HashMap+ConcurrentHashMap的扩容策略

前言 理解HashMap和ConcurrentHashMap的重点在于: (1)理解HashMap的数据结构的设计和实现思路 (2)在(1)的基础上,理解ConcurrentHashMap的并发安全的设计和实现思路 前面的文章已经介绍过Map结构的底层实现,这里我们重点放在其扩容方法, 这...

2018-09-06 11:25:56 6487 2

原创 关于Java里面多线程同步的一些知识

# 关于Java里面多线程同步的一些知识 对于任何Java开发者来说多线程和同步是一个非常重要的话题。比较好的掌握同步和线程安全相关的知识将使得我们则更加有优势,同时这些知识并不是非常容易就能熟练掌握的,实际上写出正确的并发代码是一件比较困难的事情。在Java的自带的库里面,已经包含了非常多实用...

2018-07-18 10:20:26 158 0

关于Java里面多线程同步的一些知识

# 关于Java里面多线程同步的一些知识 对于任何Java开发者来说多线程和同步是一个非常重要的话题。比较好的掌握同步和线程安全相关的知识将使得我们则更加有优势,同时这些知识并不是非常容易就能熟练掌握的,实际上写出正确的并发代码是一件比较困难的事情。在Java的自带的库里面,已经包含了非常多...

2018-07-18 09:45:00 40 0

Java单例模式之双检锁深入思考

# Java单例模式之双检锁剖析 ### 前言 单例模式在Java开发中是非常经典和实用的一种设计模式,在JDK的内部包的好多api都采用了单例模式,如我们熟悉的Runtime类,单例模式总的来说有两种创建方式,一种是延迟加载的模式,一种是非延迟加载的模式,今天我们来学习一下基于双检锁...

2018-07-08 12:25:43 157 0

关于Java里面多线程同步的一些知识

# 关于Java里面多线程同步的一些知识 对于任何Java开发者来说多线程和同步是一个非常重要的话题。比较好的掌握同步和线程安全相关的知识将使得我们则更加有优势,同时这些知识并不是非常容易就能熟练掌握的,实际上写出正确的并发代码是一件比较困难的事情。在Java的自带的库里面,已经包含了非常多...

2018-07-08 12:23:08 54 0

重新认识同步与异步,阻塞和非阻塞的概念

# 重新认识同步与异步,阻塞和非阻塞的概念 ### 前言 在实际的开发中,我们经常会听到同步,异步,阻塞,非阻塞这些编程概念,每次遇到的时候都会蒙圈,然后就各种查网上似是而非的资料,结果越查越迷糊,大部分文章都千篇一律,没有说到本质上的区别,所以下次再碰到这些概念,印象还是比较模糊,尤...

2018-07-06 14:30:41 58 0

原创 线程的基本知识总结

(一)创建线程的方式(1)实现Runnable接口(2)继承Thread类推荐使用接口,能够做到定义与实现分离,耦合更低(二)关于线程的优先级thread2.setPriority(Thread.MAX_PRIORITY)等级越高,优先运行(三)关于线程的yield的方法关于yield方法,是指当...

2018-06-27 16:29:45 129 0

线程的基本知识总结

### (一)创建线程的方式 (1)实现Runnable接口 (2)继承Thread类 推荐使用接口,能够做到定义与实现分离,耦合更低 ### (二)关于线程的优先级 thread2.setPriority(Thread.MAX_PRIORITY) ...

2018-06-27 16:27:01 44 0

原创 Java里面volatile关键字修饰引用变量的陷阱

Java里面volatile关键字修饰引用变量的陷阱如果我现在问你volatile的关键字的作用,你可能会回答对于一个线程修改的变量对其他的线程立即可见。这种说法没多大问题,但是不够严谨。严谨的回答应该是volatile关键字对于基本类型的修改可以在随后对多个线程的读保持一致,但是对于引用类型如数...

2018-06-25 11:57:20 4585 4

原创 关于Java里面的字符串拼接,你了解多少?

关于Java里面的字符串拼接,你了解多少?前言字符串拼接是我们日常开发中很常见的操作,虽然常见,但要是使用不当的的话,很有可能让你的程序处理效率降低一大半,所以我们有必要来重新了解一下Java里面的字符串操作。基础知识回顾(1)关于字符串字面量String text="我是攻城师1&qu...

2018-06-25 11:48:35 717 0

原创 深入理解Java内存模型的语义

前言Java内存模型(JMM)给我们介绍了在当代不同的硬件架构情况下,多线程程序需要关注什么问题以及如何利用JMM来正确的处理这些问题。多线程带来的问题多线程程序主要关注两个问题:(1)共享变量可见性问题(2)代码重排序一致性问题Java内存模型的关键点JMM已经保证了as-if-serial原则...

2018-06-25 11:47:48 195 0

Java里面volatile关键字修饰引用变量的陷阱

# Java里面volatile关键字修饰引用变量的陷阱 如果我现在问你volatile的关键字的作用,你可能会回答对于一个线程修改的变量对其他的线程立即可见。这种说法没多大问题,但是不够严谨。 严谨的回答应该是volatile关键字对于基本类型的修改可以在随后对多个线程的读保持一致,...

2018-06-25 11:42:33 212 0

深入理解Java内存模型的语义

[img]https://www.logicbig.com/tutorials/core-java-tutorial/java-multi-threading/java-memory-model/images/jmm.png[/img] ### 前言 Java内存模型(JMM)给我们介绍了在当...

2018-06-25 11:39:04 40 0

关于Java里面的字符串拼接,你了解多少?

# 关于Java里面的字符串拼接,你了解多少? ### 前言 字符串拼接是我们日常开发中很常见的操作,虽然常见,但要是使用不当的的话,很有可能让你的程序处理效率降低一大半,所以我们有必要来重新了解一下Java里面的字符串操作。 ### 基础知识回顾 (1)关于字符串字...

2018-06-25 11:28:54 36 0

原创 如何证明Java多线程中的成员变量数据是互不可见的

前面的几篇文章主要介绍了Java的内存模型,进程和线程的定义,特点和联系,其中在Java多线程里面有一个数据不可见的问题而我们知道使用volatile可以解决,但是如何证明这个多线程修改共享数据是不可见的呢?很简单,看下面的一段代码: private static boolean kee...

2018-06-21 10:10:06 571 2

如何证明Java多线程中的成员变量数据是互不可见的

前面的几篇文章主要介绍了Java的内存模型,进程和线程的定义,特点和联系,其中在Java多线程里面有一个数据不可见的问题而我们知道使用volatile可以解决,但是如何证明这个多线程修改共享数据是不可见的呢? 很简单,看下面的一段代码: [code="java"...

2018-06-21 10:09:13 137 0

原创 给Java字节码加上”翅膀“的JIT编译器

给Java字节码加上”翅膀“的JIT编译器上面文章在介绍Java的内存模型的时候,提到过由于编译器的优化会导致重排序的问题,其中一个比较重要的点地方就是关于JIT编译器的功能。JIT的英文单词是Just In Time翻译成中文就是及时,恰好的意思,意在说明JIT编译器优化java的class文件...

2018-06-20 10:12:52 174 0

提示
确定要删除当前文章?
取消 删除