自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(55)
  • 收藏
  • 关注

原创 进程间通信(一)--屏蔽中断

进程之间涉及共享内存,共享文件以及共享任何资源的情况都会引发竞争。  临界区(critical region):对共享内存进行访问的程序片段成为临界区。  避免竞争:使两个进程不可能同时处于临界区中。屏蔽中断 CPU只有在发生中断时才会进行进程切换。在每个进程刚刚进入临界区后立即屏蔽所有中断,在离开临界区之前打开中断,这样CPU就不会切换进程,因

2017-07-10 23:31:29 831

原创 进程间通信(二)--锁变量

使用共享锁变量,初始值为0.当一个进程想进入临界区时,会先测试锁的值。如果锁为0,则该进程将锁设置为1并进入临界区。如果锁为1,则该进程就一直等待直到锁的值变为0.缺点:当一个进程在修改锁变量的同时,另一个进程可能也在打算修改锁变量,会导致两个进程都进入临界区中。

2017-07-10 23:29:08 818

原创 进程间通信(三)--严格轮换法

while(true){ while(turn != 0);//循环等待 critical_region();//临界区 turn = 1; noncritical_region(); }while(true){ while(turn != 1);//循环等待 critical_region();//临界区 tur

2017-07-10 23:27:04 1807 2

原创 进程间通信(四)--Peterson算法

两个进程都想进入临界区。该算法思路:enterRegion(int process);//进入临界区criticalRegion();//临界区leaveRegion(int process);离开临界区全局变量:private int turn;//轮到哪一个进程进入临界区private boolean[] interested = new boo

2017-07-10 23:23:49 526

原创 双亲委派模型的理解

Java虚拟机先从最核心的API开始查找,防止不可信的类扮演被信任的类。启动类加载器 Bootstrap ClassLoader:加载\lib目录下核心库扩展类加载器 Extension ClassLoader:加载\lib\ext目录下扩展包应用程序类加载器 Application ClassLoader:  加载用户路径(classpath)上指定的类库

2017-07-09 15:40:59 3673

原创 Java运行时内存区域

运行时数据区域在执行Java程序过程中,Java虚拟机会将其管理的内存划分为若干个不同的数据区域。 ·有的数据区域伴随虚拟机启动而创建  即线程共享 ·有的数据区域伴随线程的启动和结束而建立和销毁 即线程私有程序计数器  线程私有程序计数器是当前线程执行的字节码的行号计数器。由于Java多线程是通过线程轮流切换并且分配处理器执行时间实现的,因此在每一个确定时间内,一个处

2017-06-24 16:35:13 307

原创 针对接口编程的理解

前言:随着Java的学习深入,越发觉得自己的渺小,感觉语言就像是一种哲学,语言中的些许存在,有着其存在的客观原因。彼时对某一些事物的浅薄理解,此刻以及往后再看,一边会觉得自己认知短浅,一边会感叹创造者对其思考。每一次深入思考,都会有超越以往的收获。不仅仅是学习编程,感觉更是在思考事情存在的本质。也许自己还足够渺小吧,还没有抵达巨人站立的地方。面向对象的精髓在于模拟现实  ---

2017-06-21 17:56:16 512 1

原创 idea2017安装mybatis plugin

在idea中搜索mybaitsplugin 安装后竟然需要花钱。参考网上好多方法,去替换jar包中文件夹之类的,试了好几次都没成功。我把mybatisplugin卸载了又重新安装,发现竟然有免费的mybatisplugin。安装了以后发现,功能和收费的相同,这个插件也是第一次用,反正需要的功能都有。暂时就先用着Free Mybatis plugin吧。

2017-06-11 10:53:00 5897 3

原创 Windows下Nginx无法启动的问题

在Windows下解压Nginx后,点击ngin.exe后一闪而过。然后在浏览器输入localhost,始终无法看到nginx的界面。到网上去搜索问题,有人提到可能80端口被占用,要修改端口。打开nginx.conf后修改端口为8888,再去访问,还是看不到nginx的界面。 按照网上的教程,解压安装应该没问题。我打开任务管理器,发现没有nginx的进程。这就纳闷了,明明点击了nginx.exe。

2017-06-10 09:06:22 27456 9

原创 归并排序

public void mergeSort(int[] array) { int n = array.length; for (int length = 1; length < n; length = 2 * length) mergePass(array, length, n); } public void mergeP

2017-06-09 23:39:56 210

原创 Java switch支持String类型分析

JDK7以后,switch可以使用整形和枚举常量以及String类型。整形包括整数类型和Integer包装类型。byte short  char boolean 可以隐含转换为int类型。其对应的包装类也可以。String类型这个新特性是JDK7以后加上的,在编译器层次上实现的。实现机制是将字符串的比较转为其对应哈希值的比较。switch(str)--->switch(str.hashCo

2017-06-09 10:02:36 630

原创 HashMap源码分析 基于JDK1.6

public class HashMap extends AbstractMap implements Map, Cloneable, Serializable { static final int DEFAULT_INITIAL_CAPACITY = 16; //系统默认初始容量 static final int MAXIMUM_CAPACITY = 1 << 30; //

2017-06-08 20:59:04 235

原创 HashMap中entry.hash == hash && (k == key || key.equals(k))

在看HashMap源码时看到get(key)方法时,对一判断条件开始时不太理解:public V get(Object key) { if (key == null) return getForNullKey(); int hash = hash(key.hashCode()); for (Entry<K,V>

2017-06-08 19:48:42 1922 4

原创 单例模式

第一种 懒汉 线程不安全public class Singleton { private static Singleton instance; private Singleton() { } //静态工厂方法 public static Singleton getInstance() { if (instance == null)

2017-06-08 15:55:34 198

原创 Effective Java 读书笔记之 1.考虑用静态工厂方法代替构造器

对于一个类而言,其它类要想获取该类的实例,该类必须要提供一个公有构造器。 使用静态工厂方法代替构造器的优点:静态工厂方法可以通过方法名称准确描述返回的实例对象在一个类中,可能会重载构造器,提供多个构造器共使用,构造器之间参数列表不同,有时候会难以区分,导致可能调用错误的构造器。使用静态工厂方法,通过方法名称可以准确描述要返回的实例的特征。调用静态工厂方法时不需要每一次都要创建一个新的实例对象静态工

2017-06-08 12:24:35 490 1

原创 折半插入排序

折半插入排序算法与直接插入排序类似,只是采用折半的方式查找记录要插入的位置。 折半插入排序算法: public void binaryInsertSort(int[] array) { int length = array.length; for (int i = 1; i < length; i++) { if (array[i] < arr

2017-06-06 23:27:56 386

原创 直接插入排序

直接插入排序思想:不断将无序区中的记录插入到有序区中。public void insertSort(int[] array) { int length = array.length; for (int i = 1; i < length; i++) { if (array[i] < array[i - 1]) {

2017-06-06 23:25:04 163

原创 直接插入排序

直接插入排序思想:不断将无序区中的记录插入到有序区中。public void insertSort(int[] array) { int length = array.length; for (int i = 1; i < length; i++) { if (array[i] < array[i - 1]) {

2017-06-06 23:24:50 182

原创 冒泡排序

冒泡排序是一种典型的交换排序方式。基本思想是: 无序区中相邻两个记录比较和位置交换,使得最小记录如气泡一样逐渐往上浮 冒泡排序每趟产生的有序区一定是全局有序区。冒泡排序算法:public void bubbleSort(int[] array) { int n = array.length; for (int i = 0; i < n - 1; i++) {

2017-06-06 23:20:12 300

原创 简单选择排序

简单选择排序基本思想:不断从待排序记录中选出最小的记录,按顺序放在已经排好序的记录后米娜,直到全部排完为止。简单选择排序每趟产生的有序区一定是全局有序区。public void selectSort(int[] array) { int n = array.length; for (int i = 0; i < n - 1; i++) { int

2017-06-06 22:43:03 385

原创 堆排序

堆排序从简单排序算法基础上改进得到,也是一趟一趟从无序区中选择最小的记录放到有序区中。 大根堆:每个结点都不小于其孩子结点 小更对:每个结点都不大于其孩子结点堆排序算法思想:先将array[0..n-1]调整为堆,array[0]为最大记录,然后交换array[0]和array[n-1],将最大记录归位。然后再将array[0..n-2]调整为堆,继续交换array[0]和array[n-2]…

2017-06-06 22:34:18 185

原创 MySQL中日期和时间处理总结

Mysql中日期和时间的数据类型:date 日期数据类型表示1000-01-01 ~ 9999-12-31的日期,格式为 YYYY-MM-DD ,存储空间为4bytetime 时间数据类型范围: -838:59:59 ~ 838:59:59, 格式为 HH:MM:SS,存储空间为3byte。不仅可以表示一天中的时间,还可以表示过去的时间或者两个时间的时间间隔,因此扩大了范围并且支持负数。dateti

2017-05-28 17:31:09 2036

原创 重载(overload)与重写(override)的区别

重写与重载的区别前言:经常混淆重载与重写,在此,分析两者的区别,借以理解。重写 (override)重写又叫覆盖,是子类对父类允许访问的方法的重新编写,返回值和形参都不能变,即外壳不变,核心重写!重写的好处在于,子类可以根据自己的需要,覆盖父类的行为,重新定义属于自己的行为。 在子类中调用父类被重写的方法时,要用super关键字。 例子:public class Animal { publ

2017-05-09 11:54:08 430

原创 Spring AOP之切面

静态普通方法名匹配切面1.定义两个业务类  服务生和售货员public class Waiter { public void greetTo(String name) { System.out.println("waiter greet to " + name + "..."); } public void serveTo(String n

2017-05-02 21:59:13 194

原创 Spring AOP

前置增强:使用一个程序来说明1.定义一个服务生接口,服务生只做两件事:欢迎顾客和为顾客提供服务public interface Waiter { void greetTo(String name);//提供服务 void serveTo(String name);//为顾客服务}2.定义一个训练不足的服务生类,只是会简单向顾客打招呼,并直接提供服

2017-05-02 17:08:01 201

原创 重定向和转发分派的区别

之前经常混淆重定向和转发,趁着这一次有时间,好好的总结一下两者的区别。重定向:HttpServletResponse.sendRedirect(String location) 实现重定向。location指定了重定向的URL,可以使用绝对URL和相对URL,Servlet自动将绝对URL转化成绝对URL,再生成location字段。sendRedirect()可以重定向到任何页面。包

2017-04-16 12:50:21 595

原创 Java内存模型和内存间相互操作

2017-04-14 23:14:02 273

原创 图解之TCP三次握手与四次挥手

TCP的三次握手:先看图:假设主机A运行TCP客户程序,主机B运行TCP服务器程序.A和B最初都是处于CLOSED(关闭)状态.A为主动打开连接,B为被动打开连接.B的TCP服务器进程首先创建传输控制块TCB,(保存了TCP连接的重要参数信息),准备接受客户进程的连接请求.然后,B处于LISTEN(收听)状态,等待客户的连接请求.A的TCP客户进程首先也创建传输控制

2017-04-11 12:10:14 502

原创 判断单链表是否有环

判断单链表是否存在环,基本思路是:设置快慢两个指针,first和second指针,first每次向前移动两步,second每次向前移动一步,若存在环,则在某个时刻,second必然和first相遇。相当于A和B在操场跑步,A的速度比B快一倍,则在某个时刻,A必然会追上B,俗称套圈。应用此思想,代码如下:public boolean hasCycle(Node head){ //

2017-03-16 09:38:06 303

原创 剑指offer之替换空格

// 思路1:将字符串先转化为字符数组,声明一个StringBuffer变量,如果字符为非空格,则追加该字符,否则追加%20 public String replaceSpace(StringBuffer str) { if (str == null) return null; char[] array = str.toString().toCharArray(); S

2017-03-07 22:35:48 178

原创 剑指offer之从尾到头打印链表

题目描述:输入一个链表,从尾到头打印链表每个节点的值。思路:1.首先想到采用递归的思路 从后往前打印public class Solution { class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } ArrayList list

2017-03-07 12:40:14 194

原创 红黑树详解---彻底搞懂红黑树

红黑树有以下五个性质:1.根节点为黑色2.节点为红色或者黑色3.每个叶子节点NIL为黑色4.节点为红色,则两个孩子都为黑色(即每条路径上不能有连续两个红色)5.任意一个节点到其所有子孙节点的NIL的路径上包含相同数目的黑色节点注意,在红黑树中,把传统二叉树的叶子节点的孩子指向NIL,称NIL为红黑树中的叶子节点。NIL节点中含有指向父节点的指针,这可能是需要把null改

2017-03-05 20:23:09 5502 1

原创 Thread(target)之run()方法

分析Thread(target)调用run()方法之前先来分析调用start()方法是如何运行的不论是继承Thread类创建线程还是实现Runnable接口创建线程,启动线程一般都是调用Thread类的start()方法,然后由虚拟机自动调用Thread类的run()方法。Thread源码中如下:可以发现调用过程1.首先打开start()方法: public synchronize

2017-02-10 22:12:25 4551 4

原创 java多线程之实现Runnable接口创建线程

实现Runnable接口创建线程类步骤如下:1.创建实现Runnable接口的实现类2.重写Runnable接口的run()方法3.创建实现类的线程对象4.将线程对象作为Thread的arget来创建Thread对象5.启动start()方法public class SecondThread implements Runnable{ private int i

2017-02-10 21:29:37 1824

原创 java线程状态

线程一般具有五中状态:新建,就绪,运行,阻塞,死亡新建状态(new):在程序中创建了一个线程对象之后,线程便处于新建状态,已经分配了相应内存空间和其他资源,但是处于不可运行的状态就绪状态(Runnable):线程对象调用了start()方法后,便启动了线程,线程启动后由创建状态转为就绪状态,j就绪状态相当于等待执行,进入线程队列排队,等待cpu执行,已经具备了执行资格运行sta

2017-02-09 22:56:31 387

原创 java多线程之继承Thread类创建线程类

继承Thread类创建线程类步骤如下:1.创建Thread类的子类,并重写run()方法2.创建Thread子类的实例即线程对象3.调用线程对象的start()方法//创建Thread子类public class FirstThread extends Thread{ /*重写run()方法*/ public void run(){ for(int i

2017-02-09 22:13:16 1434

原创 Java多线程之线程基础

单线程的程序只有一个顺序执行流,多线程的程序可以包括多个顺序执行流,顺序流之间互不干扰。进程进程与程序的区别运行中的程序就是进程。当一个程序进入内存运行时,就变成了一个进程。进程是系统中进行资源分配合调度的独立单位。进程的特点1.独立性:进程在系统中独立存在,独立拥有自己的资源,私有地址空间。2.动态性:程序只是动态指令集合,进程是在系统中活动的指令集合,进程拥有自己的

2017-02-09 15:46:10 353

原创 数据结构之java实现链式队列(三)

前两篇文章采用数组形式构造队列,现在用链表构造队列链式队列基本上和链表类似,基本如下:rear指针始终指向链表最后一个元素front指针始终指向链表第一个元素代码如下:public class LinkQueue { private Node front;//队头指针 private Node rear;//队尾指针 private int size = 0;

2017-02-09 14:57:20 267

原创 数据结构之java实现队列(二)

这一篇文章是上一篇文章的改进实现使用计数器代替尾指针来使队列真正容量达到maxSize队头指针:front计数器: count;队空条件:count == 0队满条件:count == maxSize进队操作:count++,(front+count)%masSize出队操作:count--,front = (front+1)%maxSize利用了计数器count,

2017-02-09 11:37:39 197

原创 数据结构之java实现队列

使用数组实现循环队列队列空:front == rear队列满:(rear + 1) % maxSize == front; 容量为队列最大容量maxSize - 1进队列:rear循环进1,再进入队列出队列:front循环进1,再出队列rear与front要保持一致,要么先+1在操作,要么先操作再+1,下面队列采用第一种形式该循环列表最大容量为maxSize-1,因为使队满条件成立时,会空出一个

2017-02-09 10:14:31 319

空空如也

空空如也

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

TA关注的人

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