自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 synchronized的优化——轻量级锁、锁消除

1.轻量级锁:针对多个线程在不同时间访问同一把锁的情况(1) 加锁:线程在执行同步块之前,JVM会在当前线程的栈桢中创建用于存储锁记录的空间,并将对象头中的Mark Word复制到锁记录中,复制的这个称作Displaced Mark Word。线程尝试使用CAS操作将对象头中的Mark Word替换为指向锁记录的指针。如果成功,则成功获取锁;如果失败,表示有其他线程竞争锁,当前线程则自旋...

2019-08-31 18:16:38 987

原创 synchronized的优化——自适应自旋、偏向锁

到JDK1.6,对synchronized加入了很多优化措施,如:自适应自旋、锁消除、锁粗化、偏向锁、轻量级锁等。在说synchronized内建锁的优化之前,先来了解两个小的知识点:1.CAS操作:我们使用synchronized加锁时,是一种悲观锁策略,即认为每一次获取锁时都会发生冲突。若当前线程获取到锁,则会阻塞其他想要获取锁的线程。而CAS操作,又称无锁操作,是一种乐观锁策略,即认...

2019-08-31 17:28:49 914

原创 synchronized的底层实现

上一篇文章博主简单介绍了synchronized的几种使用方法,下面来总结一下:1.synchronized同步代码块:synchronized(this):锁当前对象synchronized(类.class):锁当前对象的class对象,即锁住类。相当于全局锁,锁住了一整块代码synchronized(指定对象):锁指定对象2.synchronized同步方法:普通方法+syn...

2019-08-31 16:18:25 237

原创 使用synchronized实现同步

我们先来看一段代码:class TicketThread implements Runnable{ private int ticket = 10; @Override public void run() { while(this.ticket>0){ try { Thread.sleep(10...

2019-08-31 11:29:30 498

原创 线程的优先级以及守护线程

1.线程的优先级:线程的优先级指的是,线程的优先级越高越有可能先执行。我们来看几个常用方法:(1)设置优先级:public final void setPriority(int newPriority),对于设置优先级的内容可以通过Thread的几个常量来决定:public final static int MIN_PRIORITY = 1;public final static...

2019-08-30 16:00:46 205

原创 多线程常用的操作方法

1.线程的命名与取得:(1) 线程的命名:通过构造方法直接命名:public Thread (String name)public Thread(Runnable target, String name)通过Thread类提供的方法命名:public final synchronized void setName(String name)(2) 线程名的取得:取得当前正在执行...

2019-08-30 15:28:17 110

原创 创建线程的方式

首先,先来了解一下什么是线程?什么是进程?1.进程:是操作系统中一个程序的执行周期。2.线程:是进程的一个任务,即操作系统中任务调度的基本单位。3.进程与线程的区别:每个进程拥有自己的一整套变量,是操作系统资源分配的最小单位。线程依托于进程存在,多个线程可以共享进程的资源。启动、撤销一个进程的开销要比一个线程大得多。没有进程就没有线程,进程一旦关闭,所有的线程都会被撤销。4.创...

2019-08-29 11:46:36 346

原创 TCP协议之面向字节流

1.面向字节流:创建一个TCP的socket,会在网络中同时创建一个发送缓冲区和接受缓冲区。刚开始会将数据写入发送缓冲区。若数据太短,则在发送缓冲区中等待,等到合适时机会将合适大小的数据以字节流的形式发送出去;若数据太长,则进行拆分,然后发送。由于TCP是全双工的,所以读写数据时没有限制,可以一次性接受所有数据;也可以每次接收一点,分多次接收。TCP面向字节流的特点是:传输灵活...

2019-08-13 14:39:31 6687

原创 TCP的可靠传输

TCP的三大特性:面向连接、可靠传输、面向字节流上次我们已经说了三次握手四次挥手的连接管理机制,今天我们来说说TCP的可靠传输是怎样实现的。一、可靠传输:1.确认应答机制:TCP为每个字节都进行了编号,即序号。每一个ACK都有对应的确认序列号,目的是为了告诉发送者下一次要发送的位置。2.超时重传机制:发送方在发送完数据之后,会等待一个特定的时间间隔(200ms),称为超时时间。若...

2019-08-13 12:55:46 553

原创 TCP协议之三次握手四次挥手

TCP协议,全称:传输控制协议。1.TCP协议段格式:16位源端口号与目的端口号:确保端与端之间的数据传输32位序号与确认序号:确保数据的有序交付4位头部长度:解析时获取4位头部长度,最小为20字节,最大为60字节6位标志位:URG(紧急指针是否有效)、ACK(确认信号是否有效)、PSH(提示接收端应用程序立刻从TCP缓冲区读走数据)、RST(复位报文段)、SYN(同步报文段)、FI...

2019-08-13 10:32:57 129

原创 UDP协议

在网络通信中,每一条数据都必须带有一些关键信息,如:源IP地址、目的端IP地址、源端端口、目的端端口、协议,我们将这五个信息称为五元组。1.UDP协议:用户数据报协议,用于传输层的协议。UDP的协议端格式:16位UDP长度:用于指定整个UDP数据报的长度(包含头部)2.UDP协议特性:无连接、不可靠:通信时不需要建立连接,知道对端地址就可以进行数据传输,但是不关心对方是否收到数...

2019-08-12 17:25:02 551

原创 HTTP协议

在说HTTP协议之前,我们先来了解一下网址的概念。1.网址:即URL,统一资源定位符。协议名称 : //登录信息 @ 服务器地址 : 服务器端口号/文件路径?查询字符串 # 片段标识符https://www.baidu.com/s?ie=UTF-8&wd=qq邮箱登录查询字符串是用户提交给服务器的数据信息,这些数据中要是出现特殊字符,会导致url解析失败,所以查询字符串中不能出...

2019-08-12 16:49:05 117

原创 初识网络

1.在网络中,随着覆盖范围的不同,将网络划分为了一下几种类型:局域网(LAN):是指某一区域内由多台计算机互联成的计算机组。一般范围是几千米以内。城域网(MAN):是在一个城市范围内所建立的计算机通信网。广域网(WAN):一个国家或国际间建立的网络都是广域网,范围:几十公里至几万公里。2.接下来我们来了解一些基础概念:IP地址:在计算机网络中用来标识唯一 一台设备的一组数字。现...

2019-08-12 15:09:49 89

原创 Linux基本操作

linux基础指令:a. linux终端打开之后,默认处于一个目录下(当前用户的家目录)b. 命令使用格式:命令名称 [操作选项] [操作对象]1.目录相关命令:1) 浏览当前所在目录:lsa. 浏览所有文件;包括隐藏文件【linux下文件名以.开头的文件,默认不显示】:ls -ab. 浏览指定文件:ls -a [操作对象]c. 查看文件的详细信息:ls -l2) 显示当前工作路径...

2019-08-12 12:22:36 143

原创 深浅拷贝

1.浅拷贝:特点:拷贝出来的对象仍保留原对象的所有引用。缺点:“牵一发而动全身”,即改变我们所拷贝的对象的值,会影响我们原对象的值。实现方法:实现Cloneable接口并覆写其clone()。代码实现:package www.first;class People{ private String home; private float height; pub...

2019-08-12 11:42:49 68

原创 单例模式

我们都知道,JavaSE的三大设计模式是:工厂模式、代理模式、单例模式。前两个模式博主已经写过了,有兴趣的可以看一下,今天我们来说说单例模式。1.单例模式的三大特点:构造方法私有化类内部提供唯一静态私有对象类内部提供静态方法获取唯一对象2.单例模式的分类:1)饿汉式单例模式:特点:上来就new代码实现:package www.first;class HungrySi...

2019-08-12 10:31:47 141

原创 Java内存模型及其它

先来说一说一些别的东西。1.Java内存分配:对象优先在Eden区分配大对象直接进入老年代大对象其实就是需要大量连续空间的Java对象,例如:很长的字符串以及数组。虚拟机提供了一个PretenureSizeThreshold参数,大于这个参数设置值的对象直接在老年代分配空间。这样主要是为了避免在Eden区和Survivor区发生大量的内存复制。长期存活的对象进入老年代对象...

2019-08-12 09:38:34 76

原创 垃圾回收算法

学习垃圾回收算法之前,我们先来了解一下Java中方法区的回收:1.Java中方法区的回收主要收集两部分内容:废弃常量和无用的类1)废弃常量:一般来讲,在垃圾回收时,没有被任何对象引用的常量将会被回收。2)无用的类:只有同时满足一下三个条件才算是无用的类。该类的所有实例已经被回收加载该类的类加载器已经被回收该类的Class对象没有在任何地方被引用,无法在任何地方通过反射来获取该类的所有...

2019-08-10 11:48:25 56

原创 判断对象是否已“死”以及对象的自我拯救

如何判断一个对象是否已"死"呢?通常有以下几种方法:1.引用计数法:算法思想:给每个对象增加一个引用计数器,若有一个地方引用它,计数器加一;若引用失效,计数器减一;任何时刻引用计数器为0的对象就不能再被使用。Python语言采用引用计数法来管理内存;但JVM并没有选用引用计数法来管理内存,主要原因就是引用计数法无法解决对象的循环引用问题。2.可达性分析算法:算法思想:通过一系列G...

2019-08-10 09:55:24 161

原创 JVM内存区域划分

在我们学习JVM内存区域划分之前,先来看一下这几个名词:JDK(Java Development Kit):程序开发者用来编译、调试Java程序所使用的开发工具包。JRE(Java Runtime Environment):Java运行环境JVM(Java Virtual Machine):Java虚拟机,是JRE的一部分1.Java内存区域划分:线程私有内存:即每个线程都有,...

2019-08-08 13:37:17 105

原创 剑指Offer之试题解析

1.在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解题思路:给定的二维数组有规律可循,从左到右是增长的,从上到下也是增长的,所以我们可以轻易得出:左上角是最小值,右下角是最大值,这两个值不能被选取为基准值来做比较,因为是最值,比较无意义。所以我们可以...

2019-08-08 10:59:24 130

原创 HashMap之get()剖析

上次我们已经剖析了get()方法,这次来看看put()方法。1.HashMap的get()方法剖析:public V get(Object key) { Node<K,V> e; return (e = getNode(hash(key), key)) == null ? null : e.value; }可见,也是将key值进行hash...

2019-08-07 19:49:27 718

原创 HashMap之put()源码剖析

HashMap是Map集合下的常用子类,出现在JDK1.2,底层使用哈希表+红黑树实现。之前我们在学习Set接口的时候,并没有深入研究过其代码,但当我们查看Set接口常用子类HashSet的源码时,会发现Set其实就是穿了马甲的Map:private transient HashMap<E,Object> map;private static final Object PRES...

2019-08-07 19:36:14 244

原创 Map接口

Map接口是Java中保存二元偶对象,也就是键值对(key-value)的最顶层接口。1.Map接口的核心方法:public V put(K key,V value):向Map中添加数据public V get(K key):根据指定的key值取得相应的value值,若没有key值,返回nullpublic Set<Map.Entry<K,V>> entrySet...

2019-08-06 18:58:24 133

原创 集合的遍历以及fail-fast策略

1.集合遍历的四种方式:迭代输出:Iterator接口【只能从前往后输出】Iterator<String> iterator = list.iterator(); while(iterator.hasNext()){ Syxtem.out.println(iterator.next()); }双向迭代输出:ListIterator接口要想使用从后向前...

2019-08-06 17:24:55 166

原创 Collection接口

Java类集出现在JDK1.2,主要是为了解决数组的定长问题,说得简单点,类集其实就是一个动态数组。在类集的总体结构中,最重要的两个接口是Collection接口与Map接口。1.Collection接口:单个元素存储的最顶层父接口Collection接口的结构:Collection接口只定义了一个存储数据的标准,但是无法区分存储类型。因此我们往往使用Collection的两个子接口...

2019-08-06 16:44:23 123

原创 快速排序

1.一路快排:思路分析:在无序数组中选择一个基准值作为分区点,遍历数组之后,将小于该基准值的数放在左边,大于等于基准值的数放在右边。这样,将数组分为了小于区和大于等于区。根据分治思想,将两个区域分别进行排序,直到区间长度为1,说明此时数组有序。代码实现:package www.first;public class QuickSortTest{ public static vo...

2019-08-05 20:41:26 188

原创 归并排序

在学习归并排序之前,要先了解一下分治思想:1.分治思想:即分而治之,将一个大问题分解成若干的小问题进行求解。2.归并排序:算法思路:将要排序的元素进行分组,直到不能分组为止;然后每部分进行排序,从少到多直到数组全部合并,此时数组有序代码实现:package www.first;public class MergeSortTest { public static void ...

2019-08-05 17:30:49 58

原创 选择排序

选择排序是一种常见的排序算法,它的实现比较简单。1.选择排序的思想:选择排序的思想有点类似插入排序,也是将数据分为有序部分和无序部分,每次将有序部分的数据与无序部分的第一个数据进行比较,得到最小元素的索引index,然后进行交换,从而实现有序。2.代码实现:package www.first;public class selectSort { public static voi...

2019-07-29 18:02:47 67

原创 插入排序之折半插入排序、希尔排序

1.折半插入排序:折半插入排序实际上是对直接插入排序的优化,通过折半查找来找到要插入的位置,再搬移元素,最后插入即可。思路分析:定义low为有序部分的第一个位置,high为有序部分的最后一个位置,通过折半查找的方法,不断更新low和high的位置,直到 low>high,此时high+1即为我们要插入的位置。直接插入排序是在每一次比较时,就进行数据的搬移;而折半插入排序是在找到插入...

2019-07-29 17:04:43 480

原创 插入排序之直接插入排序

插入排序是一种常见的排序算法,它主要包含直接插入排序、折半插入排序、希尔排序等几种常见的排序算法。1.直接插入排序:思想:将数组中的数据分为两个区间:有序区间和无序区间。每次取无序区间的一个元素与有序区间的元素进行比较,找到该元素合适的插入位置并插入;重复这个过程。直到无序区间没有元素,即排序完成。注意:在进行元素比较的时候,无序区间的这个元素,要与有序区间的所有元素进行比较找到插入位置,...

2019-07-29 13:47:01 337

原创 模板方法模式

1.定义:在一个方法中定义一个算法的骨架,而将一些具体操作延迟到子类实现。2.组成:模板方法模式基于抽象类实现,抽象类中由三类方法组成:使用final定义的模板方法:用来定义共同的操作步骤使用final定义的普通方法:用来实现共同的具体操作使用final定义的方法,子类都只能继承,不能覆写使用abstract定义的抽象方法:用来实现不同的具体操作,要求子类必须覆写3.代...

2019-07-29 12:06:23 66

原创 代理设计模式

1.代理模式:两个子类共同实现一个接口,其中一个子类负责真实业务的实现,一个子类负责辅助真实业务的操作。2.本质:所有真实的业务操作都会有一个相应的辅助类(工具类)共同完成。3.代码实现:package www.first;//业务接口interface IBuy{ void buyPuma();}//真实业务类class RealBuyImpl implement...

2019-07-29 11:12:07 77

原创 MySQL--OJ题

找出所有员工当前(to_date=‘9999-01-01’)具体的薪水salary情况,对于相同的薪水只显示一次,并按照逆序显示 select distinct salary from salaries where to_date='9999-01-01' order by salary desc; !!!注意:order by 语句必须放到最后select salary from s...

2019-07-28 12:34:48 216

原创 冒泡排序及其优化

在认识冒泡排序之前,先来了解一下如何衡量一个排序算法的优劣:排序算法的执行效率:一般用时间复杂度来衡量排序算法的内存消耗:一般用空间复杂度来衡量这里还有一个概念就是:原地排序:就是指空间复杂度为O(1)的排序算法排序算法的稳定性:稳定性的排序即:若待排序的集合中存在值相等的元素,经过排序之后,相等元素之间的原有的顺序不会发生改变下来我们来说说冒泡排序:1.冒泡排序的思路:将一个...

2019-07-28 12:20:21 133

原创 异常的结构与捕获

1.异常的继承类结构:(1)所有的异常都是由Throwable继承下来,它的两个子类为Error和Exception。(2)Error类描述了Java运行时的内部错误和资源耗尽错误。Error类常见异常:OOM、StackOverFlow Error(3)Exception及其子类:IOException:程序本身没有问题,I/O异常(打开一个不存在的文件)RuntimeExcept...

2019-07-28 11:07:03 244

原创 webdriver--常用API的了解

在了解webdriver常用的API之前,先来了解一下webdriver的工作流程:由上图我们可以看出,当用户操作相应的浏览器时,webdriver会通过浏览器的原生组件,转化Web Service的命令为浏览器的native的调用来完成操作;脚本运行后,会打开指定浏览器,webdriver会将目标浏览器绑定到指定的端口,这样,启动后的浏览器就会接受脚本的命令。webdriver提供的八种...

2019-07-28 10:55:36 352

原创 探究BUG

1.软件测试的生命周期:需求分析、测试计划、测试设计、测试开发、测试执行、测试评估2.软件测试的生命周期:需求阶段:了解需求计划阶段:编写测试计划设计阶段:搭建测试用例框架编码阶段:编写测试用例测试阶段:编写测试报告运行维护阶段:进行验收测试3.描述Bug:版本号环境操作步骤输入数据预期结果实际结果4.Bug的级别:Blocker(崩溃):系统崩溃、死机、死循环...

2019-07-27 17:35:31 82

原创 测试分类

测试分类整理结构图:按开发阶段划分:单元测试:集成测试:系统测试:冒烟测试 --> 系统测试 --> 回归测试验收测试:按测试实施组织划分:α测试:测试人员为用户,测试坏境为开发坏境。【预发布坏境】α在β测试之前。β测试:测试人员为客户,测试坏境为用户坏境。β测试时间周期比较长。第三方测试:按是否运行划分:静态测试:不运行不仅对...

2019-07-27 17:31:25 113

原创 测试概念

1.软件测试的目的和原则:目的:验证软件是否满足用户需求,验证预期结果与实际结果之间的差异原则:以客户为中心,遵循软件测试的规范、流程、标准和要求2.需求一般指用户需求和软件需求:用户需求:用户解决问题或达到目标所需要的条件或权能软件需求:也可以叫功能性需求,描述必须实现的软件功能3.什么是bug?当且仅当规格说明是存在的并且正确,程序与规格说明之间的不匹配才是错误。(需求不一致)...

2019-07-27 17:28:58 187

空空如也

空空如也

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

TA关注的人

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