自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

24只羊羊羊

公众号:24只羊羊羊

  • 博客(38)
  • 收藏
  • 关注

转载 java并发编程——同步容器

本文转自:https://www.cnblogs.com/dolphin0520/p/3933404.html  特此申明!       为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器、并发容器、阻塞队列、Synchronizer(比如CountDownLatch)。今天我们就来讨论下同步容器。       以下是本文的目录大纲:  一.为...

2018-08-31 22:11:54 133

原创 设计模式——适配器模式

本文主要参考资料:《设计模式之禅》 本文主要目录为:1)案例2)适配器模式解决3)适配器模式的定义4)拓展 1. 案例比如我们现在有一个人力资源管理系统,其中人员信息管理的对象是所有员工的所有信息,这里的所有员工是指在职的员工,其他的离职的,退修的暂时不考虑。类图与代码如下:public interface IUserInfo { //获得用户姓名...

2018-08-31 21:11:55 11117 2

原创 设计模式——模板方法模式

本文主要参考资料:《设计模式之禅》 本文主要目录为:1)案例2)模板方法改进案例3)模板方法的定义4)钩子函数  1. 案例我们先看个例子:我们现在需要做个悍马车的模型,具体类图与代码如下:public abstract class HummerModel { //汽车发动 public abstract void start(); ...

2018-08-31 17:00:02 179

原创 java并发编程——join()

先不解释,来看下程序再说public class Demo { public void a(Thread joinThread){ System.out.println("方法a执行了"); joinThread.start(); try { joinThread.join(); } cat...

2018-08-30 00:05:08 233

转载 java并发编程——wait、notify、notifyAll和Condition

本文转自:https://www.cnblogs.com/dolphin0520/p/3920385.html 特此申明!           在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作。比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权。因为生产者如果不释放对临...

2018-08-29 21:32:10 350

转载 Java并发编程——CountDownLatch、CyclicBarrier和Semaphore

本文转自:https://www.cnblogs.com/dolphin0520/p/3920397.html 特此申明! 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法。  以下是本文目录大纲:       零. 概述  一.Cou...

2018-08-29 00:30:51 199

转载 java并发编程——CAS

 1.  乐观锁乐观锁( Optimistic Locking)其实是一种思想。相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。上面提到的乐观锁的概念中其实已经阐述了他的具体实现细节:主要就是两个步骤:冲突检测和数据更新。其实现方式有一种比较典型的就是C...

2018-08-26 23:02:16 343

原创 java并发编程——临界区,互斥量,信号量

四种进程或线程同步互斥的控制方法1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。2、互斥量:为协调共同对一个共享资源的单独访问而设计的。3、信号量:为控制一个具有有限数量用户资源而设计。4、事 件:用来通知线程有一些事件已发生,从而启动后继任务的开始。 1.临界区(Critical Section) 保证在某一时刻只有一...

2018-08-26 10:14:29 2517

转载 JVM与JMM

最近翻看了java线程相关的东西,书中有一边专门讲到java内存模型,读完之后边回想起java虚拟机模型,那时心中便在思考java内存模型(以下简称JMM)和java虚拟机模型(以下简称JVM)之间的关系,下面将详细讲述。 一JVM结构jvm的内部结构如下图所示,这张图很清楚形象的描绘了整个JVM的内部结构,以及各个部分之间的交互和作用。 1 Class Loader(类加...

2018-08-26 08:20:32 382

原创 java并发编程——锁优化

 本博文目录为:一.  线程安全的实现方法二.  锁的优化三.  乐观锁与悲观锁 一.   线程安全的实现方法 1. 互斥同步        互斥同步(Mutual Exclusion & Synchronization)是常见的一种并发正确性保障手段。同步是指在多个线程并发访问共享数据时,保证共享数据在同一个时刻只被一个(或者是一些,使用信号量的时候)...

2018-08-23 16:52:37 266

转载 java并发编程——Java线程池 ThreadPoolExecutor、ScheduledThreadPoolExecutor 和 Executors工厂

Java中的线程池类有两个,分别是:ThreadPoolExecutor和ScheduledThreadPoolExecutor,这两个类都继承自ExecutorService。利用这两个类,可以创建各种不同的Java线程池,为了方便我们创建线程池,Java API提供了Executors工厂类来帮助我们创建各种各样的线程池。下面我们分别介绍一下这三个类。   一、Thread...

2018-08-23 13:34:54 230

转载 java并发编程——Java线程池 ExecutorService

本篇主要涉及到的是java.util.concurrent包中的ExecutorService。ExecutorService就是Java中对线程池的实现。一、ExecutorService介绍ExecutorService是Java中对线程池定义的一个接口,它java.util.concurrent包中,在这个接口中定义了和后台任务执行相关的方法: Java API对Execut...

2018-08-23 10:56:10 14841 4

转载 java并发编程——Callable、Future 和 FutureTask

本文转自:https://www.cnblogs.com/dolphin0520/p/3949310.html 特此申明! 在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦...

2018-08-23 10:50:07 157

转载 java并发编程——java内存模型

本文转自:https://blog.csdn.net/suifeng3051/article/details/52611310 特此申明还有这篇文章也写得很好:https://blog.csdn.net/dd864140130/article/details/58359102  ----------------------------------------------------...

2018-08-22 22:58:37 232

转载 java并发编程——Lock

在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问。本文我们继续来探讨这个问题,从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock。  也许有朋友会问,既然都可以通过synchronized来实现同步访问了,那么为什么还需要提供Lock?这个问题将在下面进行阐述。本文先从synchronize...

2018-08-22 19:30:11 192

转载 java并发编程——Synchronized

本文转自:https://www.cnblogs.com/dolphin0520/p/3923737.html 特此申明 虽然多线程编程极大地提高了效率,但是也会带来一定的隐患。比如说两个线程同时往一个数据库表中插入不重复的数据,就可能会导致数据库中插入了相同的数据。今天我们就来一起讨论下线程安全问题,以及Java中提供了什么机制来解决线程安全问题。  以下是本文的目录大纲:  一...

2018-08-22 18:12:03 131

转载 java并发编程——Volatile

  本文转自:http://www.cnblogs.com/dolphin0520/p/3920373.html  特此申明!        volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。  volatile关键字虽...

2018-08-22 15:36:52 132

原创 java并发编程——创建线程之匿名内部类与Lambda方式

关于匿名内部类和lambda的基础可以看我博客文章:内部类  ,  Lambda看完上面链接的两篇文章你就能看懂下面代码了: 1. 匿名内部类的方式 /** *匿名内部类的方式启动线程 */public class T2 { public static void main(String[] args) { new Thread(){ ...

2018-08-22 10:49:49 3393

转载 Java遍历Map对象的四种方式

本文转自:  https://www.jb51.net/article/74089.htm 方法一.    这是最常见的并且在大多数情况下也是最可取的遍历方式。在键值都需要时使用Map<Integer, Integer> map = new HashMap<Integer, Integer>(); for (Map.Entry<Integer, In...

2018-08-21 18:57:11 149

原创 哈希表

1. 什么是哈希表 我们先来做个题(leetCode上387题)public class Solution_387 { public int firstUniqChar(String s) { int[] freq = new int[26]; for(int i=0 ; i<s.length() ; i++) ...

2018-08-19 21:01:27 1063 2

原创 深入理解JVM——字节码执行引擎之方法调用(6)

本文主要参考:《深入理解Java虚拟机》—周志明         方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还不涉及方法内部的具体运行过程。在程序运行时,进行方法调用是最普遍、最频繁的操作,但前面已经讲过,Class文件的编译过程中不包含传统编译中的连接步骤,一 切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运...

2018-08-16 16:44:17 647

原创 深入理解JVM——类的加载过程(5)

本文主要参考:《深入理解Java虚拟机》—周志明 0. 概述       虚拟机把描述类的数据从class文件(注意这里不一定非得要从一个Class文件获取,这里既可以从ZIP包中读取(比如从jar包和war包中读取),也可以在运行时计算生成(动态代理),)加载到内存,并对数据进行校验、解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制。      ...

2018-08-15 15:24:03 367

原创 2-3树与红黑树

 红黑树与2-3树具有等价性,我们在了解红黑树前先了解2-3树对我们理解红黑树是有帮助的,同时,对于理解B树也是有帮助的(用于磁盘存储,文件系统或数据库存储) 1.  2-3树下面的图片就是一颗2-3树可以看出,2-3树是一棵绝对平衡的树——根节点到任意一个叶子节点所经过的节点数量是相同的那么2-3树是怎样来维护它的绝对平衡的呢?我们来看看下面例子假设现在有...

2018-08-15 10:47:34 1636 3

原创 算法的时间复杂度

 1.时间复杂度 首先我们要知道什么是大O,教科书中有非常严谨的定义,但对于面试的我们并不需要去专文字游戏,我们需要理解它:n表示数据规模 ; O( f(n) )表示运行算法所需要执行的指令数,和f(n)成正比。 比如下面例子其中abcd都是常数,是固定不变的,换句话说,随着n的增大,比如二分查找法是被logn所控制的,和a没有关系,所以大O里面一般都把常数省去,我们再看看...

2018-08-14 09:54:07 49976 4

原创 平衡二叉树和AVL

1  概述              对于一棵二分搜索树,如果我们的数据是顺序添加到二分搜索树中,它就会退化成一个链表。我们如何解决这个问题呢,我们需要在现有的二分搜索树的基础上添加一些机制,使得我们二分搜索树能维持平衡二叉树这样的一个性质,而AVL就是一种最为经典的平衡二叉树。什么样的树才是平衡二叉树呢?满二叉数:除了叶子节点,其余节点都有左右子树,所以是一棵平衡二叉树而...

2018-08-13 09:32:56 3663 1

原创 深入理解JVM——垃圾回收(4)

本文主要参考:《深入理解Java虚拟机》—周志明 0. 概述我们本文主要关注一下几点:一.如何判定对象为垃圾对象1)引用计数法2)可达性分析法二.如何回收1)回收策略:   ●标记-清除算法    ●复制算法    ●标记-整理算法     ●分代收集算法2)垃圾回收器:    ●Serial    ●Parnew    ●Cms     ●G1 1. ...

2018-08-11 16:12:40 559

原创 深入理解JVM——对象的创建(3)

1. 对象的创建 我们先来看看对象的创造过程,如下图对象的创建需要类的加载,这个以后会在类加载器的章节详细说明我们先来讲讲虚拟机为对象分配内存:分配内存分为指针碰撞和空闲列表两种方式,这两种方式是由内存是否规整决定的,而是否规整又是由垃圾回收策略决定的,如果垃圾回收器有压缩整理的功能,则可以使用指针碰撞:1)指针碰撞:前提是堆内存中的空闲空间十分的规整,使用和未使用的空...

2018-08-11 12:21:11 461

原创 深入理解JVM——内存管理概述(2)

本文主要参考:《深入理解Java虚拟机》—周志明 0. 概述我们知道java相比于c,c++的优势在于内存管理。而内存管理由JVM来负责一个java程序的编译和执行过程如下: ●  java   ---------编译---------->   .class ●  类加载器负责加载各个字节码文件(.class) ●  加载完.class后,由执行引擎执行,在执行过...

2018-08-11 08:36:51 199

原创 深入理解JVM——分类(1)

1. Sun Classic Vm第一款商用的虚拟机,只能使用纯解释器的方式来执行java代码。已经过时了。 2. Exact Vm1)Exact的全称是Exact Memory Management 准确式内存管理(虚拟机可以知道内存中某个位置的数据是什么内存的)。2)编译器和解释器混合工作以及两级即时编译器。3)只在Solaris平台发布。还没在windows即其他平台...

2018-08-10 16:38:26 823

原创 排序算法总结(java)

注意:2.1节copy于:https://www.cnblogs.com/chengxiao/p/6194356.html 1. O(n^2)的排序算法 1.1  冒泡排序(Bubble Sort)假如我们要排序这个数组:【8,6,2,3,1】第一次(0-4):【6,8,2,3,1】-->【6,2,8,3,1】--> 【6,2,3,8,1】-->【6,2,...

2018-08-10 10:42:33 240

原创 堆和优先队列

1.优先队列的概念优先队列和其实是队列的一种普通队列:先进先出;后进先出优先队列:出队顺序和入队顺序无关;和优先级相关优先队列的接口和普通队列的接口是完全相同的,只是在出队和查看队首的实现方式会不同(优先级最高的在队首);优先队列可以使用不同的底层数据结构来实现 我们对队列这种抽象的数据结构做一些限制,创造出优先队列这个概念,我们在实现这个概念时可以使用不同的底...

2018-08-09 17:29:59 11474

原创 二叉树之二分搜索树

先来看看二叉树的定义:    我们再来看看二分搜索树:   看完基本概念我们来看代码:完成的代码在我github上:https://github.com/yangbishang/Data-Structures,代码上有详细注解;这里我只讲解下思路: 1.二分搜索树的前序中序后序遍历(深度优先遍历)        前面的图片...

2018-08-08 11:56:26 612

原创 Stream流

从jdk1.8专门提供了Stream接口,同时在Collection接口里面也提供有为此接口实例化的方法1.Stream基础操作stream主要功能是进行数据的分析处理,同时主要是针对于集合中的数据进行分析操作。要看懂下面程序可能需要lambda表达式的知识    Lambda表达式steam的基本操作:import java.util.ArrayList;import j...

2018-08-06 15:42:21 216

原创 枚举enum与多例设计

 枚举的主要作用是定义有限个数对象的一种结构(多例设计),枚举就属于多例设计,其结构比多例结构更简单 1 枚举的基本定义从jdk1.5之后程序之中提供了enum的关键字,此关键字可以实现枚举的定义范例:public enum Color { RED,GREEN,BLUE; //实例化对象}public class Test { public st...

2018-08-04 11:20:19 2436

原创 Lambda表达式

结合这篇博客https://blog.csdn.net/bitcarmanlee/article/details/70195403一起看效果更佳!1.Lambda             从JDK1.8开始为了简化使用者进行代码开发,专门提供有Lambda表达式的支持,利用此操作形式可以实现函数式的编程,对于函数式编程比较著名的语言:haskell,Scala,利用函数式的编程可以避免掉面...

2018-08-03 21:25:19 1472

转载 java中的接口(jdk1.8)与抽象类

主意:本文部分内容cv至:https://www.cnblogs.com/dolphin0520/p/3811437.html#,但本文更正了接口方法中的部分错误和修改了部分内容,特此申明! 一.抽象类  在了解抽象类之前,先来了解一下抽象方法。抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法的声明格式为:abstract void fun();抽象方法必须用...

2018-08-02 18:15:01 4232 3

转载 java继承知识点

原文地址:http://www.cnblogs.com/lwbqqyumidi/p/3509992.html Java中的继承作为Java面向对象三大特性之一,在知识点上而言,还是很多的。现做出如下总结:1. 继承的概念:继承在本职上是特殊—一般的关系,即常说的is-a关系。子类继承父类,表明子类是一种特殊的父类,并且具有父类所不具有的一些属性或方法。 2. 继承中的初始化...

2018-08-02 16:38:42 1048

转载 JAVA泛型

原文地址:https://www.cnblogs.com/lwbqqyumidi/p/3837629.html 一. 泛型概念的提出(为什么需要泛型)?首先,我们看下下面这段简短的代码:public class GenericTest { public static void main(String[] args) { List list = new A...

2018-08-02 15:41:39 102

空空如也

空空如也

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

TA关注的人

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