自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 ThreadLocal原理(源码)

先说结论:ThreadLocal本身并不是,也不会存储thread-local变量,而是操作thread-local变量的工具。真正的thread-local变量是存储在Thread里的ThreadLocalMap(ThreadLocal的静态内部类)的对象,而且ThreadLocalMap的对象中的ThreadLocalMap.Entry[] table的元素中还存储了ThreadLocal的信息。详情可以看源码。ThreadLocal部分源码: /** * Retu..

2020-08-01 16:14:19 48

原创 静态内部类实现单例模式以及不需要显式使用锁的原因

先说结论:静态内部类实现单例模式,是借助了类加载器加载类的特性实现的,类加载器在加载类时使用了synchronized关键字.单例模式代码:public class SingletonDemo { public static void main(String[] args) { SingletonDemo sd1 = getInstance(); SingletonDemo sd2 = getInstance(); System.out

2020-07-02 16:48:06 119

原创 java线程池原理--如何实现线程和任务分离,并保证线程在一定时间内不销毁的?

先说下结论:如何实现线程和任务分离呢?线程和任务都是实现了Runnable接口的类,不同的是,扮演线程的类通过start()方法创建线程并执行其中的run()方法,而扮演任务的类则不会调用start()方法,在线程的run()方法中能获取到任务的引用,并直接调用任务的run方法(无论是直接在run()方法中使用,还是在somemethod()方法中,然后在run()方法中调用somemethod()).如何实现不销毁的呢?首先,纠正一点,有人说在使用线程池的时候,从中找一个空闲的线程拿过来用

2020-07-02 15:33:49 192

原创 哲学家就餐问题的解决(java实现)

前言:生产者-消费者模型和哲学家就餐问题是多线程中比较经典的两个问题.通过这两个问题,可以很好地了解和实践下java多线程的基础知识.哲学家就餐问题:有五个哲学家,他们的生活方式是交替地进行思考和进餐。他们共用一张圆桌,分别坐在五张椅子上。在圆桌上有五个碗和五支筷子,平时一个哲学家进行思考,饥饿时便试图取用其左、右最靠近他的筷子,只有在他拿到两支筷子时才能进餐。进餐完毕,放下筷子又继续思考。对java多线程不熟悉的可以先看下生产者-消费者模型是怎么实现的,然后再独立实现哲学.

2020-06-29 23:03:44 80

转载 生产者消费者模型的五种实现(java)

前言生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,生产者往存储空间中添加产品,消费者从存储空间中取走产品,当存储空间为空时,消费者阻塞,当存储空间满时,生产者阻塞。现在用四种方式来实现生产者消费者模型wait()和notify()方法的实现这也是最简单最基础的实现,缓冲区满和为空时都调用wait()方法等待,当生产者生产了一个产品或者消费者消费了一个产品之后会唤醒所有线程。/** * 生产者和消费者,wait()和notify()的实现 *

2020-06-29 17:35:23 91

转载 git cherry-pick详解

对于多分支的代码库,将代码从一个分支转移到另一个分支是常见需求。这时分两种情况。一种情况是,你需要另一个分支的所有代码变动,那么就采用合并(git merge)。另一种情况是,你只需要部分代码变动(某几个提交),这时可以采用 Cherry pick。一、基本用法git cherry-pick命令的作用,就是将指定的提交(commit)应用于其他分支。$ git cherry-pick <commitHash>上面命令就会将指定的提交commitHash,应用于当

2020-06-29 07:02:27 201

原创 java基础数据类型大小

可以通过基础类型对应的包装类获取基础类型的大小,如char,可以查看Character类: /** * The number of bits used to represent a {@code char} value in unsigned * binary form, constant {@code 16}. * * @since 1.5 */ public static final int SIZE = 16; /*.

2020-06-25 18:44:56 63

转载 Java语言中:float、double数据类型在内存中是如何存储的

java语言中,float类型数字在计算机中用4个字节(32位)来存储。double类型占用8个字节(64位)。从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float是32位的,double是64位的,所以double能存储更高的精度。  按照IEEE制定的浮点数表示法来进行float,double运算。这种结构是一种科学计数法:用符号、指数和尾数来表示。指数可正可负,所以,IEEE规定,此处算出的次方必须减去127才是真正的指数。底数定为2,即把一个浮点数表示为尾数乘.

2020-06-25 18:28:00 109

原创 Double的MIN_VALUE和Integer的MIN_VALUE

Integer的MIN_VALUE是:-2147483648MAX_VALUE是:2147483647Integer的源码:/** * A constant holding the minimum value an {@code int} can * have, -2<sup>31</sup>. */ @Native public static final int MIN_VALUE = 0x80000000; /**

2020-06-25 18:25:28 93

转载 Java中List, Integer[], int[]的相互转换

本文涉及到一些Java8的特性.import java.util.Arrays;import java.util.List;import java.util.stream.Collectors; public class Main { public static void main(String[] args) { int[] data = {4, 5, 3, 6, 2, 5, 1}; // int[] 转 List<Integer&gt.

2020-06-24 07:51:58 126

转载 快速排序-挖坑填数+分治法

快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。该方法的基本思想是:1.先从数列中取出一个数作为基准数。2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。3.再对左右区间重复第二步,直到各区间只有一个数。虽然快速排序称为分治法,但分治法这三个字显然无法很好的概括快速排序的全部步骤。因此我的对快速排序作了进一步的说明----挖坑填数+分治法:.

2020-06-24 06:53:13 102

转载 BI、数据仓库、ETL、大数据开发工程师有什么区别?

一味的解释 数据仓库 概念可能没意思,我们从不同角色出发吧老板:我是一家手机公司的老板,今天要向去董事局汇报,我要准备一份介绍过去三年的用户增长、用户留存、用户活跃度、手机里面每个APP使用率等情况的报表,假如下面没我下面没有BI,那我肯定就蒙逼了。。BI: 我是一名非技术BI,我天天看竞品的分析报告,看双十一销量,看各种评论,知道自己的产品有哪些短板有哪些长处,我分析南北地域差异,国内外客户喜好,总之我在手机领域有着很强的行业解读能力和数据解读能力,我可以画出非常漂亮的图表和PP...

2020-06-23 20:30:02 360

转载 Google Protocol Buffer 的使用和原理(c++)

简介什么是 Google Protocol Buffer? 假如您在网上搜索,应该会得到类似这样的文字介绍:Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 个 .proto 文件。他们用于 RPC 系统和持续数据存储系统。Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或

2020-06-23 20:01:05 127

转载 阿里巴巴为什么不用 ZooKeeper 做服务发现?

站在未来的路口,回望历史的迷途,常常会很有意思,因为我们会不经意地兴起疯狂的念头,例如如果当年某事提前发生了,而另外一件事又没有发生会怎样?一如当年的奥匈帝国皇位继承人斐迪南大公夫妇如果没有被塞尔维亚族热血青年普林西普枪杀会怎样,又如若当年的丘老道没有经过牛家村会怎样?2008 年底,淘宝开启一个叫做“五彩石”的内部重构项目,这个项目后来成为了淘宝服务化、面向分布式走自研之路,走出了互联网中间件体系之始,而淘宝服务注册中心 ConfigServer 于同年诞生。2008 年前后,Yahoo 这...

2020-06-22 19:32:29 96

转载 加密货币的本质

现在,各种加密货币(cryptocurrency)不计其数。很多人都在问,加密货币的时代,真的来临了吗?将来会不会人类不再使用美元、人民币,改用加密货币?那么多品种,我应该使用哪一种币?要不要现在就去投资一些?一、钱是什么?我们都知道,人民币是钱,美元是钱,金银财宝是钱。我问一个问题,它们为什么能成为钱?你可能回答,因为它们有价值,或者是价值的代表。但是,有价值的东西多了,为什么只有这些品种成为了钱?答案很容易想到,因为人们普遍相信(认同)它们的价值,其他东西的价值.

2020-06-22 10:51:53 85

转载 比特币入门教程

比特币(bitcoin)诞生于2008年的一篇论文。一个署名为中本聪的人,提出了革命性的构想:让我们创造一种不受政府或其他任何人控制的货币!这个想法堪称疯狂:一串数字,背后没有任何资产支持,也没有任何人负责,你把它当作钱付给对方,怎么会有人愿意接受?但是,狂想居然变成了现实。随后的几年,在全世界无数爱好者的支持下,比特币网络运行起来了,越来越多的人和资本参与,星星之火,终成燎原。刚刚过去的2017年,比特币迎来了爆发式的增长,从年初的1000美元,最高涨到了2万美元,全世界都为之震动,上到政府,

2020-06-22 10:46:52 187

转载 区块链入门

一、区块链的本质区块链是什么?一句话,它是一种特殊的分布式数据库。首先,区块链的主要作用是储存信息。任何需要保存的信息,都可以写入区块链,也可以从里面读取,所以它是数据库。其次,任何人都可以架设服务器,加入区块链网络,成为一个节点。区块链的世界里面,没有中心节点,每个节点都是平等的,都保存着整个数据库。你可以向任何一个节点,写入/读取数据,因为所有节点最后都会同步,保证区块链一致。二、区块链的最大特点分布式数据库并非新发明,市场上早有此类产品。但是,区块链有一个革命性...

2020-06-22 10:33:31 130

转载 mysql面试题

如何设计一个关系型数据库?首先划分为两大部分,一个存储部分,类似文件系统将数据持久化到硬盘上, 另一个是程序实例部分,创建模块: 存储管理,缓存机制,SQL解析,日志管理,权限划分,容灾机制**,索引管理,锁模块**。数据库的三范式是什么?第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项。 第二范式:要求实体的属性完全依赖于主关键字。所谓完全 依赖是指不能存在仅依赖主关键字一部分的属性。 第三范式:任何非主属性不依赖于其它非主属性。事务的基本要素 ACIDAto

2020-06-18 10:39:44 71

转载 Linux面试题

如今程序员生产的代码99%都部署在linux环境下,代码发现缺陷,程序员的第一反应是到 Linux 上拉日志下来看。程序员不是运维,不需要掌握非常多复杂命令。推荐终端工具SecureCRT xshell常用命令(重要)ls/ll、cd、mkdir、rm-rf、cp、mv、ps -ef | grep xxx、kill、free-m、tar -xvf file.tar查看进程:(例:如何查看所有xx进程) ps -ef | grep xxx​ ps -aux | grep xxx(-

2020-06-16 17:05:23 80

转载 设计模式

有一些重要的设计原则在开篇和大家分享下,这些原则将贯通全文:面向接口编程,而不是面向实现。这个很重要,也是优雅的、可扩展的代码的第一步,这就不需要多说了吧。 职责单一原则。每个类都应该只有一个单一的功能,并且该功能应该由这个类完全封装起来。 对修改关闭,对扩展开放。对修改关闭是说,我们辛辛苦苦加班写出来的代码,该实现的功能和该修复的 bug 都完成了,别人可不能说改就改;对扩展开放就比较好理解了,也就是说在我们写好的代码基础上,很容易实现扩展。创建型模式创建型模式的作用就是创建对象,说到创建一

2020-06-16 17:03:40 52

转载 原型模式

在有些系统中,存在大量相同或相似对象的创建问题,如果用传统的构造函数来创建对象,会比较复杂且耗时耗资源,用原型模式生成对象就很高效,就像孙悟空拔下猴毛轻轻一吹就变出很多孙悟空一样简单。原型模式的定义与特点原型(Prototype)模式的定义如下:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节。例如,Windows 操作系统的安装通常较耗时,如果复制就快了很多。在生活中

2020-06-16 17:01:17 48

转载 建造者模式

在软件开发过程中有时需要创建一个复杂的对象,这个复杂对象通常由多个子部件按一定的步骤组合而成。例如,计算机是由 OPU、主板、内存、硬盘、显卡、机箱、显示器、键盘、鼠标等部件组装而成的,采购员不可能自己去组装计算机,而是将计算机的配置要求告诉计算机销售公司,计算机销售公司安排技术人员去组装计算机,然后再交给要买计算机的采购员。生活中这样的例子很多,如游戏中的不同角色,其性别、个性、能力、脸型、体型、服装、发型等特性都有所差异;还有汽车中的方向盘、发动机、车架、轮胎等部件也多种多样;每封电子邮件的发件人

2020-06-16 16:54:31 60

转载 jvm面试题

JVM 的主要组成部分及其作用类加载器(ClassLoader) 运行时数据区(Runtime Data Area) 执行引擎(Execution Engine) 本地库接口(Native Interface)组件的作用: 首先通过类加载器(ClassLoader)会加载类文件到内存,Class loader只管加载,只要符合文件结构就加载。运行时数据区(Runtime Data Area)是jvm的重点,我们所有所写的程序都被加载到这里,之后才开始运行。字节码文件只是 JVM 的一套指

2020-06-16 16:02:58 91

转载 java多线程面试题

临界资源临界资源是一次仅允许一个进程使用的共享资源。各进程采取互斥的方式,实现共享的资源称作临界资源。属于临界资源的硬件有,打印机,磁带机等;软件有消息队列,变量,数组,缓冲区等。进程间采取互斥方式,实现对这种资源的共享。临界区:每个进程中访问临界资源的那段代码称为临界区(criticalsection),每次只允许一个进程进入临界区,进入后,不允许其他进程进入。线程和进程的区别?进程是系统资源分配的最小单位,线程是程序执行的最小单位 进程使用独立的数据空间,而线程共享进程

2020-06-16 15:43:31 87

转载 Linux vmstat命令实战详解

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令,一个是Linux/Unix都支持,二是相比top,我可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)。一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数,如:

2020-06-16 15:31:25 52

转载 java并发基础

JMM(Java 内存模型)原子性(Atomictiy)原子性是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。可见性(Visibility)可见性是指当一个线程修改了某一个共享变量的值时,其他线程能否立即知道这个修改。缓存优化,硬件优化,指令重排,编辑器的优化。可能导致的可见性问题。有序性(Ordering)有序性是指:在本线程内观察,所有操作都是有序的。在一个线程观察另一个线程,所有操作都是无序的,无序是因为发生了指令重排序。在

2020-06-16 15:25:16 43

转载 Java容器

一 概览容器的思维导图:CollectionListJava 的 List 是非常常用的数据类型。List 是有序的 Collection。Java List 一共三个实现类: 分别是 ArrayList、Vector 和 LinkedList。ArrayList:ArrayList 是最常用的 List 实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数 组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要将已经有数 组的数据复制到新的存储空间中。

2020-06-16 00:28:35 68

转载 计算机网络面试题

TCP/IP四层网络模型第一层 网络接口层网络接口层包括用于协作IP数据在已有网络介质上传输的协议。协议:ARP,RARP第二层 网间层网间层对应于OSI七层参考模型的网络层。负责数据的包装、寻址和路由。同时还包含网间控制报文协议(Internet Control Message Protocol,ICMP)用来提供网络诊断信息。协议:本层包含IP协议、RIP协议(Routing Information Protocol,路由信息协议),ICMP协议。第三层 传输层传输层..

2020-06-16 00:14:34 62

转载 java基础

Java 语言有哪些特点/什么是Java?简单易学; 面向对象(封装,继承,多态); 平台无关性( Java 虚拟机实现平台无关性); GC实现垃圾回收; 异常处理机制; 支持多线程; 支持网络编程并且很方便; 编译与解释并存;面向对象和面向过程的区别面向过程:面向过程性能比面向对象高。因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考量因素的时候,比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发。但是,面向过程没有面向对象易维护、易复用、..

2020-06-15 23:57:30 43

原创 jconsole本地连接失败(linux)

本地运行java程序,然后打开一个shell,输入jconsole:选中要连接的程序,如图中的CpuTest,然后点击Connect按钮,然后连接失败,重新连接,还是失败.后经排查发现是因为本地的java是14,程序使用的是11,将两者改为一致的,成功连接上.如果不是因为版本不一致,可能需要设置程序启动的jvm参数.-Djava.rmi.server.hostname=xxx.xxx.xxx.xxx (服务器ip,或者localhost)-Dcom.sun.management.jm

2020-06-13 09:57:45 106

转载 Java LinkedList源码剖析

LinkedList总体介绍方法剖析add()remove()get()set()LinkedList总体介绍LinkedList同时实现了List接口和Deque接口,也就是说它既可以看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(Stack)。这样看来,LinkedList简直就是个全能冠军。当你需要使用栈或者队列时,可以考虑使用LinkedList,一方面是因为Java官方已经声明不建议使用Stack类,更遗憾的是,Java里根本没有一个叫

2020-06-09 22:26:18 40

转载 深入理解Java PriorityQueue

PriorityQueue总体介绍方法剖析add()和offer()element()和peek()remove()和poll()remove(Object o)PriorityQueueJava中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示。本文从Queue接口函数出发,结合生动的图解,深入浅出地分析PriorityQueue每个操作的具体过程和时间复杂度,将让读者建立对PriorityQueue建立清晰而深入的认识。总体介绍前面以Java

2020-06-09 22:24:33 37

转载 ArrayDeque

前言总体介绍方法剖析addFirst()addLast()pollFirst()pollLast()peekFirst()peekLast()前言Java里有一个叫做Stack的类,却没有叫做Queue的类(它是个接口名字)。当需要使用栈时,Java已不推荐使用Stack,而是推荐使用更高效的ArrayDeque;既然Queue只是一个接口,当需要使用队列时也就首选ArrayDeque了(次选是LinkedList)。总体介绍要讲栈和队列,首先要讲Deque接

2020-06-09 22:23:02 59

转载 漫画算法:什么是外部排序?

背景西天取经的路上,一样上演着编程的乐趣.....排序的时候我们可以选择快速排序或归并排序等算法。为了方便,我们把排序好的2G有序数据称之为有序子串吧。接着我们可以把两个小的有序子串合并成一个大的有序子串。注意:读取的时候是每次读取一个int数,通过比较之后在输出。按照这个方法来回合并,总共经过三次合并之后就可以得到8G的有序子串。接下来把12个数据分成4份,然后排序成有序子串然后把子串进行两两合并...

2020-06-09 20:29:49 42

转载 Linux下Mycat安装配置和使用

1.mycat安装下载mycat解压tar -zxvf Mycat-server-1.6-RELEASE-20161012170031-linux.tar.gz把mycat文件夹移动到 /usr/local/ 下mv Mycat-server-1.6-RELEASE-20161012170031-linux /usr/local/mycat2.新建用户和组groupadd mycatuseradd -r -g mycat mycatchown -R mycat:...

2020-06-09 09:05:18 74

转载 Linux下安装mysql

一 安装前准备1、检查是否已经安装过mysql,执行命令[root@localhost /]# rpm -qa | grep mysql从执行结果,可以看出我们已经安装了mysql-libs-5.1.73-5.el6_6.x86_64,执行删除命令[root@localhost /]# rpm -e --nodeps mysql-libs-5.1.73-5.el6_6.x86_64再次执行查询命令,查看是否删除[root@localhost /]# r...

2020-06-09 07:54:36 62

转载 Ubuntu 14.04 安装 chkconfig 服务管理程序

一、 问题起源由于CentOS7 存在的问题,在 docker centos 容器中运行 ceph,执行 systemctl 指令会遇到如下错误:Failed to get D-Bus connection: Operation not permitted感觉这个问题只能换宿主机操作系统才能很好地解决,代价太大,遂决定使用Ubuntu14.04 容器运行ceph。注意:只能安装 ceph hammer 或更低版本,因为新版本采用 systemd 管理服务,老版本使用的 chkconf...

2020-06-09 07:44:38 46

转载 刚刚安装完mysql就提示密码过期!

mysql 5.7.14安装完后登陆报错,意思是密码过期[root@mysql]# mysql -u root -pEnter password:ERROR 1862 (HY000): Your password has expired. To log in you must change it using a client that supports expired passwords.解决办法:1.在my.cnfmysqld 部分加入 skip-grant-tables ..

2020-06-09 07:37:10 94

转载 Linux下Redis的安装和部署

一、Redis介绍Redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系统。和Memcache类似,但很大程度补偿了Memcache的不足,它支持存储的value类型相对更多,包括string、list、set、zset和hash。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作。在此基础上,Redis支持各种不同方式的排序。和Memcache一样,Redis数据都是缓存在计算机内存中,不同的是,Memcache只能将数据缓存到内存中,无

2020-06-09 05:05:36 50

转载 SpringBoot集成MyCat

什么是Mycat  MyCat是一个开源的分布式数据库系统,前端用户可以把它看作是一个数据库代理。其实现的核心原理是“拦截” 。Myacat拦截用户发送过来的Sql语句,做一些特定的分析:如分片分析,路由分析,读写分析,读写分离分析。然后将SQL发往真实的数据库。不同于其他的中间件比如druid连接池,Mycat使用的是Nio异步通信机制(非阻塞型的),它的线程池数量默认为1,实际生产环境线程数=CPU的核数。推荐使用Mycat1.6版本,项目中MyCat配置代替原数据源的配置,非常简单。应

2020-06-08 19:53:57 115 1

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