- 博客(70)
- 收藏
- 关注
原创 【Java并发机制】锁的升级和对比
为了减少获得锁和释放锁所带来的的消耗,Java SE1.6引入了“偏向锁”和“轻量级锁”。锁一共有四种状态,级别从低到高依次是:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态,这几个状态会随着竞争情况逐渐升级。锁可以升级却不能降级,意味着偏向锁在升级为轻量级锁后不能降级为偏向锁。这种锁可以升级却不能降级的状态,是为了提高获得锁和释放锁的效率。????偏向锁大多数情况下,锁不仅不存在多线程竞争,而且总是由同一线程多次获得,为了让线程获得锁的代价更低而引入了偏向锁。当一个线程访问同步块并获取锁时,会在
2020-07-14 00:56:02
223
原创 【JVM】自动内存管理机制(1)---自动内存管理机制
运行时数据区域JVM在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域都有各自不同的用途以及创建和销毁的时间。其结构如图所示:JVM运行时数据区程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。在JVM的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程回复等基础功能都需要依赖这个计数器来完成。各条线程之间计数器互不影响,独立存储。...
2020-06-23 23:52:54
277
原创 【JVM】虚拟机类加载机制(3)---类加载器
JVM将类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到JVM外部去实现,以便让程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。类与类加载器类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远远不限于类加载阶段。对于一个任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在JVM中的唯一性。每一个类加载器,都拥有一个独立的类命名空间。也即:要比较两个类是否“相等”,只有在这两个类是由同一个类加载器加载的前提下才有意义,否
2020-06-15 01:40:29
231
原创 【JVM】虚拟机类加载机制(2)---类加载的过程
加载、验证、准备、解析、初始化是类加载的全过程。加载“加载”是“类加载”(Class Loading)过程的一个阶段,在加载阶段需要完成以下三件事情:1.通过一个类的全限定名来获取定义此类的二进制字节流2.将这个字节流代表的静态存储结构转化为方法区的运行时数据结构3.在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口二进制流的获取途径:1.从ZIP包中获取,称为JAR、EAR、WAR格式的基础2.从网络中获取,常见的有Appl
2020-06-05 01:55:26
213
原创 【JVM】虚拟机类加载机制(1)---类加载机制概述及类加载的时机
概述 Java语言里面,类型的加载、连接和初始化过程都是在程序运行期间完成的,这种策略虽然会令类加载时稍微增加一些性能开销,但是会为Java应用程序提供高度的灵活性,Java天然可以动态扩展的语言特性就是依赖运行期动态加载和动态连接这个特点实现的:例如编写一个面向接口的应用程序,可以等到运行时再指定其实际的实现类;用户可以通过Java预定义的和自定义类加载器,让一个本地的应用程序可以在运行时从网络或者其他地方加载一个二进制流作为程序代码的一部分,这种组装应用程序的方式已广泛应用于Java程序之中。...
2020-06-02 01:20:06
251
原创 Java线程生命周期
Java中的线程包括NEW、RUNNABLE、RUNNING、BLOCKED和TERMINATED五种阶段,它们的转换关系可以用下图来表示:在使用new关键字创建了一个Thread对象时,在调用start方法启动该线程前,线程的状态都为NEW状态,和普通的Java对象并没有什么区别。线程通过调用start方法从NEW状态进入RUNNABLE状态,此时JVM中真正创建了一个新的线程,线程...
2019-11-18 22:40:45
173
转载 【转】解决sublime3无法访问packagecontrol.io的问题
重装了Sublime Text3之后发现install package一直报错Package ControlThere are no packages available for installationPlease see https://packagecontrol.io/docs/troubleshooting for help查了很久之后发现原来是 packagecontr...
2019-04-01 10:39:28
524
原创 【设计模式】建造者模式
建造者模式:将一个复杂对象的构建与它的表示分离,使得相同的构建过程可以创建不同的表示。 结构图如下: Builder是为创建一个Product对象的各个部件指定的接口,ConcreteBuilder是具体建造者,实现Builder接口,构造和装配各个部件。Product是具体的产品角色,Director是指挥者,使用Builder接口进行具体...
2018-09-03 22:55:19
230
原创 【git】git常用指令
将工程拖到本地:git clone url 查看当前库状态以免引发冲突:git status 更新本地库:git pull 切换分支:git checkout branchname 创建分支:git branch branchname 在本地创建并切换到新分支,只有在提交时服务器端才会创建新分支:git checkout -b branchname 添加文件:touch filenam...
2018-08-29 11:48:00
228
原创 【设计模式】外观模式
迪米特法则(LoD):如果两个类不必须彼此直接通信,那么这两个类就不应该发生直接的相互作用,如果一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。 外观模式(Facade):为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 外观模式的适用场景:在设计初期阶段,应该有意识的...
2018-08-28 23:18:45
209
原创 【设计模式】模板方法模式
模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。模板方法模式是通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势,即提供了一个很好的代码复用平台。 本模式通过不同学生答题来进行模拟,代码如下:package chapter10;pub...
2018-08-22 23:14:35
180
原创 【设计模式】原型模式
原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。 本设计模式通过创建简历的例子进行说明,并对对象的浅复制和深复制进行说明。 浅复制模式代码如下:package chapter9;public class Resume...
2018-08-22 00:32:08
188
原创 【设计模式】工厂方法模式
简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。但是在增加功能时,需要在原来的工厂类的方法里增加代码,修改原有的类,也就是说不但对扩展开放了,也对修改开放了,违背了开放-封闭原则。 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个...
2018-08-13 23:12:27
208
原创 【设计模式】代理模式
代理模式(Proxy),为其它对象提供一种代理以控制对这个对象的访问。 代理模式适用的场合:远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。 虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。例如浏览器优化下载。 安全代理,用来控制真实对象访问时的权限。一般用于对象应该有...
2018-08-01 21:34:12
154
原创 【设计模式】装饰模式
装饰模式(Decorator):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。 Component是定义一个对象接口,可以给这些对象动态地添加职责。ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责。Decorator,装饰抽象类,继承了Component,从外类来扩展Component类的功能...
2018-07-16 22:45:48
179
原创 【设计模式】软件设计需要遵循的原则
No.1 单一职责原则(Simple Responsibility Principle->SRP) 就一个类而言,应该仅有一个引起它变化的原因。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当发生变化时,设计会遭受到意想不到的破坏。软件设计真正要做的许多内容,就是发现职责并把那些职责相互分立...
2018-07-05 23:58:03
998
原创 【设计模式】策略模式
本篇文章的场景是模拟一个商场收银软件,营业员根据客户所购买商品的单价和数量向客户收费。使用简单工厂模式和策略模式分别进行实现。 简单工厂模式实现: 使用类对收费进行抽象:面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类。 现金收费抽象类:...
2018-06-26 22:42:38
250
原创 【设计模式】简单工厂模式
简单工厂模式又称静态工厂方法模式,不属于GOF设计模式。是由一个工厂对象决定创建出哪一种产品类的实例。优点在于只需要特定的输入就可以利用工厂类的静态方法实例化出合适的对象,缺点在于容易违反高内聚责任分配原则。 以计算器实例为例进行实践,本篇代码简化为由Console输出进行模拟。 目标类:package chapter1;/** * ...
2018-05-22 01:00:08
228
转载 数据结构之图:图的存储结构和遍历
文章出处:http://blog.chinaunix.net/uid-26548237-id-3483650.html一、图的存储结构1.1 邻接矩阵 图的邻接矩阵存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中的边或弧的信息。 设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为:
2015-06-26 16:38:14
866
原创 MFC学习笔记之简单MP3播放器的设计
通过编写一个基于对话框的MFC应用程序来实现基本的播放器功能。其控制主要是通过调用操作系统内置的MP3解码引擎来实现对播放的控制。 首先对MCI(Media Control Interface)媒体控制接口作简单介绍,MCI是微软公司提供的一组多媒体设备和文件的标准接口,其优点是可以方便地控制绝大所数多媒体设备,包括音频、视频、影碟、录像等多媒体设备,而不需要知道它们的内部工作状况
2015-06-24 19:44:55
3099
转载 二叉树的三种遍历方法
代码地址:http://www.oschina.net/code/snippet_166683_53231. [代码][C/C++]代码 ?12345678910111213141516171819
2015-06-23 15:58:28
741
转载 数组和广义表
原文地址:http://blog.youkuaiyun.com/moodytong/article/details/69894325.1 数组的定义数组:由一组类型相同、下标不同的变量构成。特点:各个元素具有统一类型、下标 具有固定上界和下界、基本操作简单(初始化、销毁、修改、存取)N维数组:n个下标,每个元素受到n个关系约束;一个n维数组可以看成是由若干个n-1维数组成的
2015-06-19 15:41:19
810
转载 数据结构--栈和队列
1.栈1.1 栈的定义栈是一种特殊的线性表。其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行。如下所示:结论:后进先出(Last In First Out),简称为LIFO线性表。栈的基本运算有六种:构造空栈:InitStack(S)、判栈空: StackEmpty(S)、判栈满: StackFull
2015-06-16 09:16:18
625
转载 C++栈和队列
使用标准库的栈和队列时,先包含相关的头文件#include#include定义栈如下:stack stk;定义队列如下:queue q;栈提供了如下的操作[cpp] view plaincopys.empty() 如果栈为空返回true,否则返回false s.
2015-06-16 09:07:54
517
转载 链表各类操作详解
原文地址:http://blog.youkuaiyun.com/hackbuteer1/article/details/6591486/链表概述 链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。它可以根据需要开辟内存单元。链表有一个“头指针”变量,以head表示,它存放一个地址。该地址指向一个元素。链表中每一个元素称为“结点”,每个结点都应包括两个部分:一为用户需要用的实
2015-06-11 15:55:12
663
转载 函数指针与指针函数
一、辨别指针函数与函数指针最简单的方式就是看函数名前面的指针*号有没有被括号包含,如果被包含就是函数指针 ,反之则是指针函数。1、指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针 类型标识符 *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个地址值
2015-06-08 19:39:21
472
原创 【学习笔记2015/06/07】动态链接库相关问题
在VS2010编译环境下,与VC6.0下有所不同,在建立dll所在工程时不仅要有源文件而且要有头文件,在定义函数时需要加关键字_declspec(dllexport),而且在需要调用dll文件的工程文件目录下需要包含头文件,.lib和.dll文件才能够进行函数调用。在用dumpbin查看exe输入文件相关信息时,如果无法打开,需要关闭命令行并重新打开,此时即可查看。
2015-06-07 16:05:08
504
原创 【2015/06/05】学习笔记
字节数,字符串个数与字符串长度的区别:在纯ASCII码下,字节数=字符串长度=字符个数,因为每个字符就一个字节。在Unicode下,字节数/2=字符串长度=字符个数,因为每个字符都是2个字节。在ASCII码与其它双字节字符系统混用时,字节数=ASCII码字符个数+双字节字符个数*2,而此时字符串长度到底怎么统计就不好说了,有的语言如C语言,此时字符串长度=字节数,有的语言如JS,此时字
2015-06-05 09:17:13
591
转载 Java中JOptionPane的用法
JOptionPane类1、属于javax.swing 包。2、功能:定制四种不同种类的标准对话框。ConfirmDialog 确认对话框。提出问题,然后由用户自己来确认(按"Yes"或"No"按钮)InputDialog 提示输入文本MessageDialog 显示信息OptionDialog 组合其它三
2014-09-21 16:02:03
1754
原创 zoj1057
#include#includeint main(){ int num1,num2,n,i,m=0,j; int A[21],B[21]; while(scanf("%d",&n)!=EOF) { if(n==0)break; if(m!=0)printf("\n"); m=1; num1=0;
2012-09-17 23:58:09
496
原创 zoj2869
#include#includeusing namespace std;int main(){ int ncase,n,i; int coe[110]; cin>>ncase; while(ncase--) { cin>>n; for(i=0;i<=n;i++) cin>>coe[i]; if(n==0)cout<<0
2012-08-20 11:04:09
415
原创 zoj2987
#include#include#includeusing namespace std;int main(){ int ncase,n,i,len,t=1; char ch[100]; cin>>ncase; while(ncase--) { cin>>n; getchar(); cin>>ch;
2012-08-20 10:44:42
395
原创 zoj2970
#include#include#include#includeusing namespace std;int re[10000000];int main(){ int ncase,n,i,max,min; char ch[20]; cin>>ncase; while(ncase--) { max=0; min=INT_MAX;
2012-08-20 10:43:31
432
原创 zoj2988
#include#include#includeusing namespace std;int main(){ int n,i=1; double num,res; char c[10]; cin>>n; while(n--) { cin>>num; getchar(); cin>>c; if(strcmp(
2012-08-20 10:09:37
370
原创 zoj2886
#include#includeusing namespace std;int main(){ int ncase,len,i,j; char str[1010]; cin>>ncase; while(ncase--) { cin>>str; len=strlen(str); j=1; for
2012-08-16 20:06:11
396
原创 zoj2878
#include#includeusing namespace std;int main(){ int ncase,d,num,len,max,min; cin>>ncase; while(ncase--) { min=INT_MAX; max=0; cin>>num; while(num--)
2012-08-16 19:33:12
318
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人