自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

河湾

积土而为山,积水而为海

  • 博客(30)
  • 问答 (2)
  • 收藏
  • 关注

原创 Java多线程并发:进程调度算法

一 优先调度算法1.先来先服务调度算法(FCFS)当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用 FCFS 算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机,特点是:算法比较...

2019-05-22 00:13:38 618

转载 互联网架构:从设计到开发让你少踩坑

本文作者:朱晔,熟悉.NET、Java技术栈,多年MVP,先后任职育碧软件、英孚教育、5173、空中网、饿了么等互联网公司,对技术管理、系统架构、深度学习比较感兴趣。本文出自:技术琐话这里所说的三架马车是指微服务、消息队列和定时任务。如下图所示,这里是一个三驾马车共同驱动的一个立体的互联网项目的架构。不管项目是大是小,这个架构模板的形态一旦定型了之后就不太会变,区别只是我们...

2019-05-17 09:57:04 210

原创 Java多线程并发:CyclicBarrier、CountDownLatch、Semaphore 的用法

关注微信公众号:「树森笔记」1、CountDownLatch(线程计数器 )CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。 final CountDownLatch latch = new CountDow...

2019-05-17 09:53:03 256

原创 僵尸进程与孤儿进程

僵尸进程与孤儿进程1 基本概念unix/linux中,正常情况下,子进程是通过父进程创建的,子进程再创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程到底什么时候结束。当一个 进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将...

2019-03-31 20:45:03 92

原创 RPC学习笔记

什么是RPC?Remote Procedure Call Protocol,远程过程调用。什么是“远程”?先来看下什么是“近”,即“本地函数调用”。int result = Add(1, 2);这行代码的时候,到底发生了什么?传递两个入参调用了本地代码段中的函数,执行运算逻辑返回一个出参这三个动作,都发生在同一个进程空间里,这是本地函数调用。那有没有办法,调用一个跨进...

2019-09-25 12:07:54 182

原创 基本类型int和包装类型integer的比较 - == or equals

java中有两种类型基本类型:基本数据类型存的是数值本身引用类型:引用类型变量在内存放的是数据的引用基本类型通过==比较的是它们的值大小,而引用类型比较的是他们的引用地址。 基本类型和包装类型通过==比较的是值的大小,通过equals比较的也是值得大小。public boolean equals(Object obj) { if (obj instanceof In...

2018-05-15 19:24:17 3062

原创 排序算法之归并排序

归并排序是建立在归并操作上的一种有效的排序算法,1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。基本思想归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而...

2018-05-13 20:03:44 208

原创 排序算法之快速排序

快速排序(Quicksort)是对冒泡排序的一种改进,借用了分治的思想,由C. A. R. Hoare在1962年提出。1、基本思想快速排序的基本思想:挖坑填数+分治法。首先选一个轴值(pivot,也有叫基准的),通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 2、算法描述快速排...

2018-05-13 19:15:02 460 1

原创 排序算法之堆排序

1991年的计算机先驱奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德(Robert W.Floyd) 和威廉姆斯(J.Williams) 在1964年共同发明了著名的堆排序算法(Heap Sort).堆的定义如下:nn个元素的序列 {k1,k2,⋅⋅⋅,kn}{k1,k2,···,kn} 当且仅当满足下关系时,称之为堆。 把此序列对应的二维数组看成一个完全二叉树。那么堆的含义就是:...

2018-05-13 15:29:03 238

原创 排序算法之希尔排序

希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。本文会以图解的方式详细介绍希尔排序的基本思想及其代码实现。基本思想希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,...

2018-05-13 14:30:37 514 5

原创 排序算法之3种简单排序 - 选择、冒泡、直接插入

排序是数据处理中十分常见且核心的操作,虽说实际项目开发中很小几率会需要我们手动实现,毕竟每种语言的类库中都有n多种关于排序算法的实现。但是了解这些精妙的思想对我们还是大有裨益的。本文简单温习下最基础的三类算法:选择,冒泡,插入。先定义个交换数组元素的函数,供排序时调用/** * 交换数组元素 * @param arr * @param a * @...

2018-05-13 11:58:49 270

原创 初识Java垃圾回收

垃圾回收机制是 Java 非常重要的特性之一,也是面试题的常客。它让开发者无需关注空间的创建和释放,而是以守护进程的形式在后台自动回收垃圾。这样做不仅提高了开发效率,更改善了内存的使用状况。本文将从以下几个方面对垃圾回收机制进行讲解,希望读完可以对垃圾回收有个初步认识。一、什么是Java堆内存堆是在 JVM 启动时创建的,主要用来维护运行时数据,如运行过程中创建的对象和数组都是基于...

2018-05-10 21:37:23 211

原创 微服务架构设计

一、微服务概述1、什么是微服务?微服务就是一些可独立运行、可协同工作的小的服务。从概念中我们可以提取三个关键词:可独立运行、可协同工作、小。这三个词高度概括了微服务的核心特性。下面我们就对这三个词作详细解释。可独立运行 微服务是一个个可以独立开发、独立部署、独立运行的系统或者进程。可协同工作 采用了微服务架构后,整个系统被拆分成多个微服务,这些服务之间往往不是完全独立的...

2018-05-09 21:05:01 3460

转载 对JAVA集合进行遍历删除

本文转自对JAVA集合进行遍历删除时务必要用迭代器 有以下代码:public static void main(String args[]) { List<String> famous = new ArrayList<String>(); famous.add("liudehua"); famous.add("madehua"); ...

2018-05-08 23:29:50 296

转载 CSRF 攻击

本文转自CSRF 攻击的应对之道CSRF 背景与介绍CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一。其他安全隐患,比如 SQL 脚本注入,跨站域脚本攻击等在近年来已经逐渐为众人熟知,很多网站也都针对他们进行了防御。然而,对于大多数人来说,CSRF 却依然是一个陌生的概念。即便是大...

2018-05-08 23:02:10 164

原创 Java服务端性能优化的常见方案

作为一个Java后端开发,我们写出的大部分代码都决定着用户的使用体验。如果我们的后端代码性能不好,那么用户在访问我们的网站时就要浪费一些时间等待服务器的响应,造成极差的用户体验,这就可能导致用户投诉甚至用户的流失。性能优化是一个很大的话题。《Java程序性能优化》说性能优化包含五个层次:设计调优、代码调优、JVM调优、数据库调优、操作系统调优等。而每一个层次又包含很多方法论和最佳实践。本文只举...

2018-05-05 11:35:23 3725

原创 HashMap的死循环-HashMap Infinite Loop

问题的症状从前我们的Java代码因为一些原因使用了HashMap这个东西,但是当时的程序是单线程的,一切都没有问题。后来,我们的程序性能有问题,所以需要变成多线程的,于是,变成多线程后到了线上,发现程序经常占了100%的CPU,查看堆栈,你会发现程序都Hang在了HashMap.get()这个方法上了,重启程序后问题消失。但是过段时间又会来。而且,这个问题在测试环境里可能很难重现。Ha...

2018-05-02 23:22:29 364

原创 解读Java中的clone方法

对象的创建clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。那么在java语言中,有几种方式可以创建对象呢?使用new操作符创建一个对象使用clone方法复制一个对象那么这两种方式有什么相同和不同呢? new操作符的本意是分配内存。程序执行到new操作符时...

2018-04-26 22:44:41 351

原创 从String源码看-为什么JDK中的String不可变

什么是不可变对象?       我们都知道, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。不能改变状态的意思是,不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引...

2018-04-26 22:10:28 395

原创 重写equals()方法就必须重写hashCode()方法

       最近看了Object类的源码,对hashCode() 和equals()方法有了更深的认识。重写equals()方法就必须重写hashCode()方法的原因,需要从源头Object类讲起。public native int hashCode();public boolean equals(Object ...

2018-04-26 00:04:58 565

原创 Java中的Object类

一、Object类的概述Java的Object是所有其他类的父类,从继承的层次来看它就是最顶层根类,所以它也是唯一一个没有父类的类。所有类都默认直接或间接继承Object类。 如上图所示,Object类定义了对象常用的一些方法,包括非final方法:equals,hashCode,toString,clone(访问限制级别:protected)和finalize(访问限制级别:prote...

2018-04-25 23:44:55 957

原创 Java创建线程的方式

1、创建线程的方式继承Thread,重写run方法实现Runnable接口,重写run方法实现Callable接口,重写call方法(在执行完任务之后能够获取执行结果)2、具体实现及使用2.1、继承Thread,重写run方法public class MyThread extends Thread { @Override public void r...

2018-04-23 21:18:13 177

原创 Java线程池的实现原理

线程是稀缺资源,如果被无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,合理的使用线程池对线程进行统一分配、调优和监控,有以下好处:降低资源消耗提高响应速度提高线程的可管理性Java1.5中引入的Executor框架把任务的提交和执行进行解耦,只需要定义好任务,然后提交给线程池,而不用关心该任务是如何执行、被哪个线程执行,以及什么时候执行。demo Executo...

2018-04-15 00:47:48 216

原创 Java线程池ThreadPoolExecutor

一、线程池的工作原理线程池刚创建时,里面没有一个线程。任务队列是作为参数传进来的。不过,就算队列里面有任务,线程池也不会马上执行它们。当调用 execute() 方法添加一个任务时,线程池会做如下判断: 如果正在运行的线程数量小于 corePoolSize,那么马上创建线程运行这个任务。 如果正在运行的线程数量大于或等于 corePoolSize,那么将这个任务放入队列。 ...

2018-04-15 00:04:20 190

原创 MySQL索引 - 最左匹配原则

表结构,有三个字段,分别是id,name,cid CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `cid` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `name_cid_IN...

2018-04-13 23:36:41 441

原创 MySQL索引

1、概述      索引是存储引擎用于快速查找记录的一种数据结构,通过合理的使用数据库索引可以大大提高系统的访问性能,接下来主要介绍在MySql数据库中索引类型,以及如何创建出更加合理且高效的索引技巧。2、索引的优点1、大大减轻了服务器需要扫描的数据量,从而提高了数据的检索速度2、帮助服务器避免排序和临时表3、可以...

2018-04-13 23:05:10 214

原创 MySql存储引擎InnoDB的锁

InnoDB锁模式InnoDB实现了以下两种类型的行锁: 共享锁(S):允许一个事务去读一行,阻止其他事务获得相同的数据集的排他锁。 排他锁(X):允许获得排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁。共享锁就是我读的时候,你可以读,但是不能写。排他锁就是我写的时候,你不能读也不能写。另外,为了允许行锁和表锁共存,实现多粒度锁机制,InnoDB还有两种内部使用的...

2018-04-13 22:09:28 357

原创 MySQL的存储引擎

       一直在用mysql,也看过一些资料,但是都比较零散,没有形成系统的知识体系和概念,这篇博文 整合了部分之前看过的mysql存储引擎方面的资料和笔记,加深对存储引擎的了解。存储引擎的概述       MySQL中的数据用各种不同的技术存

2018-04-12 23:47:00 356

原创 缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级、缓存热点 key

关于Redis经常被问到的问题:缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级、缓存热点 key等概念的入门及简单解决方案。一、缓存雪崩缓存雪崩我们可以简单的理解为:由于原有缓存失效,新缓存未到期间(例如:我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期),所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机。从而形成一...

2018-04-11 23:35:51 1916

原创 进程与线程的概念,区别和联系

对于进程和线程的概念,区别和联系一直似懂非懂,模棱两可。今天,翻阅资料,进行了系统性的学习和整理。 进程与线程的一个简单解释(-_-)这篇博客非常形象的解释了进程和线程之间的关系。进程概念  进程是表示资源分配的基本单位,又是调度运行的基本单位。例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格、内存空间、磁盘空间、I/O设备等。然后,把该进程放人进程的就绪队列。...

2018-04-11 22:48:09 475

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

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