自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 Hibernate与MyBatis比较

最近做了一个Hibernate与MyBatis的对比总结,希望大家指出不对之处。第一章     Hibernate与MyBatisHibernate 是当前最流行的O/R mapping框架,它出身于sf.net,现在已经成为Jboss的一部分。 Mybatis 是另外一种优秀的O/R mapping框架。目前属于apache的一个子项目。MyBatis 参考资料官网:

2013-08-27 17:17:07 2960

原创 TDD简介

2001年2月《敏捷宣言》签定,宣告了敏捷开发运动的开始。敏捷的开发方式引起越来越多开发者的关注,世界上出现了各种各样的敏捷软件开发方法, SCRUM,Crystal,特征驱动开发(Feature Driven Development,FDD),自适应软件开发(Adaptive Software Development,ADP)以及极限编程(eXtreme Programming,XP) 等等

2013-08-04 21:58:11 4141

原创 IOS导航控制器

UINavigationController通常用于根据先后次序呈现具有包含或父子关系的多个视图。UITabBarController主要用于组织和管理具有并列关系的多个视图。当我们的应用程序需要呈现具有前后关系的多屏信息的时候,就可以考虑用UINavigationController来维护和管理这样的“堆式”信息。这里的“堆”指的是一个视图控制器数组,而在导航控制器中显示的每一屏信息都是数组

2013-07-28 17:34:31 4117

原创 IOS表格

IOS中的表格视图由UITableView类型的对象负责。UITableView会显示一个具有多行但仅有一列的数据内容。如果控制器的主视图是UITableView,我们就把这样的控制器叫做表格视图控制器。在Cocoa Touch中对应的类为UITableViewController。表格视图的组成部分表格视图会显式一个列表,列表的每一个元素就是单元格,我们可以通过垂直滚动手势浏览这些单元格

2013-07-24 23:38:49 5626

原创 通过Return键控制虚拟键盘消失

不管是UITextField控件还是UITextView对象,如果它们处于编辑状态且被用户点击,在屏幕上会出现一个虚拟键盘,这个虚拟键盘于First Responder有直接的关系。当一个UITextField处于第一响应状态(用户在控件中编辑文字)的时候,就会出现一个虚拟键盘。当UITextField不处于第一响应状态也不在编辑状态,并且视图中的其他UITextField或UITextV

2013-07-21 23:37:27 1175

转载 final详解

在java中,final关键字可以有如下的用处: final关键字可以被加到类的声明中,final类是不允许继承的;final关键字可以被加到方法声明中,final方法是不允许重写的(override),这个效果同私有方法一样;final关键字可以被家到属性或者变量的声明中,final属性或者变量一旦赋值之后就不允许再发生变化。对于基本类型(primitive type),比如int、do

2013-06-02 22:06:54 846

转载 在多线程下的long和double

在看一些代码的时候,会发现在定义long型和double型的变量时,会在前面加上volatile关键字,当然也会看到在其它原子类型的变量前加上这个关键字,但这里要说的还是有区别的。 在java中,java的内存模型要求,变量的读取操作和写入操作都必须是原子操作的,但是对于非volatile类型的long和double有些不同,因为这两个变量是64位存储,JVM允许将64位的读操作或

2013-05-28 23:14:29 713

转载 应该使用32位还是64位JVM

应用使用32位的JVM,还是应该使用64位的JVM,我自己以前还真没想过,大家都想过了吗?本文是Plumbr中的一篇博文,为大家提了个醒。(2012.11.27最后更新)    在我的企业级软件开发职业生涯中,我多次面对这个问题。每隔一段时间我不得不建议配置一个新的特定环境。而往往该问题部分与"我应该使用32位还是64位JVM?"这一问题有关。老实说,一开始我是靠掷硬币来解决的,而不是给出

2013-05-28 23:11:32 969

转载 Ruby类名

一、类名为什么是常量?#当前类是Objectself.class#=>Object#添加一个类Cclass C ; endObject.constants.grep /^C$/ #=>[:C] #这时在当前类Object中添加了常量 :C#:所以类名是常量。二、这里的类名常量C,为什么是所有作用域可见?类名常量C添加在Object类中

2013-05-26 23:33:01 845

转载 require 和 load

Ruby 基础篇 之 如何山寨 require 和 load前几天被一个初学 Ruby 的同学问及 require 和 load 有什么区别。后来想想这个问题虽然答案并不难,但是还可以引申出不少可以探讨的内容。所以我打算通过山寨一个 require 和 load 的方法的形式,来阐述一些内容。在开始之前我们首先假设我们有一个 person.rb 文件,内容如下:# -*-

2013-05-26 23:31:20 653

原创 Ruby方法

方法定义于对象,用来进行与该对象的相关操作。Ruby中所有的操作都以方法的形式来实现一般情况下,我们通过(对象.方法名)的方式来调用方法。其中对象被称为是接收者。根据接收者的不同,我们将方法区分为3种:实例方法当对象(实例)存在的时候,把该对象作为接收者的方法叫做实例方法。类方法当接收者不是实例而是类的时候,这个方法称为类方法。调用的时候不光可以用’.’还可以使用’

2013-05-26 23:27:41 594

原创 软件的坏味道

1) Duplicated Code(重复代码) 2) Long Method(过长函数) 3) Large Class(过大类) 4) Long Parameter List(过长参数列) 5) Divergent Change(发散式变化)——过耦合 6) Shotgun Surgery(散弹式修改)——过度的分散与过耦合相反 7) Feature Envy(依恋情节)

2013-05-24 15:00:00 766

原创 Ruby变量和常量

变量是程序设计不可缺少的东西。所谓变量,可以想象是贴在“东西”上的铭牌。给对象贴上铭牌,可以写成:变量名 = 对象这个动作被称为“将对象赋值给变量”。如: num = 10 age = 18 name = 'TAKAHASHI'和JAVA的变量一样,Ruby的变量标识的也是对象的引用。当然基本类型指向的还是实际对象,赋值后会新建对象。这点和JAVA也是一样的。变量的

2013-05-04 23:22:57 3970

原创 类初始化时机

对于类加载过程中初始化阶段,虚拟机严格规定了有且只有四种情况必须立即对类进行“初始化”:遇到new、getstatic、putstatic和invokestatic这4条指令码时,如果类没有初始化,则需要先进行初始化。这4条指令对应的java场景是:使用new关键字实例化对象读取或设置一个静态字段,不包括被final修饰的、已在编译器把结果放入常量池的静态字段调用一个静态方法使

2013-05-01 21:44:35 764 1

原创 线程安全和锁优化

线程安全当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象就是线程安全的。JAVA线程安全不可变通过java的final关键字来事项。对于基本数据类型,直接用final修饰即可保证不可变性;但是对于对象,需要保证对象的行为不会对其状态产生任何影响

2013-04-28 22:32:20 1410

原创 java内存模型简述

JAVA内存模型我们知道计算机在实现多线程操作时,不仅仅需要CPU处理器并发操作,更重要的是并发时,CPU寄存器、高速Cache同主内存间的数据交互。只有保证了这些才能保证安全的线程操作。C语言需要直接操作硬件来完成这些,所以它一旦更换机子就不行了。那么JAVA是如何保证的呢?JAVA虚拟机通过内存模型(JMM)屏蔽掉各种硬件和操作系统的内存访问差异,以实现让JAVA程序在各种平台下都能达

2013-04-27 22:17:09 770

原创 垃圾回收

垃圾收集(Garbage Collection,GC)主要关注堆和方法区,回收满足回收条件的空间。对象回收对于堆上的对象实例,垃圾收集器在进行回收操作前,首先要判别实例对象是否被引用,准确的是判别对象是否“死亡”,因为有引用不代表不需要回收。判别对象时候被引用有2个算法:引用计数法给对象添加一个引用计数器,每当有一个地方引用它时,计数值就加1;当引用失效时就减1。任何时候如果计

2013-04-24 21:26:16 512

原创 运行时数据区域

java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途及创建和销毁时间,有的随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。这里有个图其中方法区和堆,是所有线程共享的。虚拟机栈、本地方法栈和程序计数器由线程独享的。程序计数器程序计数器是一块较小的内存空间,它的作用可以看作是当前线

2013-04-22 23:04:53 520

转载 SQL优化

一、问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一。系统优化中一个很重要的方面就是SQL语句的优化。对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统不

2013-04-15 13:59:20 482

转载 50个常见的Unix/Linux指令

1. tar command examplesCreate a new tar archive.$ tar cvf archive_name.tar dirname/Extract from an existing tar archive.$ tar xvf archive_name.tarView an existing tar archive.$ tar t

2013-04-14 23:11:31 597

转载 oracle group 扩展

rollup:为每个分组返回一个小计,同时为所有分组返回总计;SQL> select emp_id,month,prd_type_id,amount2 from all_sales3 where emp_id=214 order by emp_id,month ;    EMP_ID      MONTH PRD_TYPE_ID     AMOUNT----------

2013-04-14 23:00:11 448

原创 原子变量和非阻塞同步机制

现在并发算法领域多数研究都侧重于非阻塞算法,这种算法利用底层的原子机器指令代替锁来确保数据在并发中的一致性。非阻塞算法在设计和实现上比锁方案要复杂的多,但是它能够提供更好的可伸缩性和活跃性。我们可以使用原子变量来构建高效的非阻塞算法。原子变量不光可以用在构建非阻塞算法上,它还可以当做volatile同时还可以支持原子更新操作。锁的劣势现在JVM对非竞争的锁获取和释放等操作进行了极大的优

2013-02-22 23:00:38 497

原创 显式锁

在java5之前,在协调对共享对象的访问时可以使用的机制只有synchronized和volatile。5新增了一种机制,ReentrantLock。与之前的机制不同的是,ReentrantLock不是一种替代内置锁的机制,而是当内置锁机制不适用时,作为一种可选择的高级功能。LockLock是显式锁的抽象接口,提供了加锁、解锁等功能。它提供了一种无条件的、可轮询的、定时的以及可中断的锁获取

2013-02-21 22:10:06 938

原创 并发性能和可伸缩性

线程的主要目的就是提高程序的运行性能。此外,线程还可以使程序在运行现有任务的情况下立即开始处理新的任务,从而提高系统的响应性。性能的思考提升性能意味着可以用更少的资源做更多的事情。但是提升性能会带来额外的复杂度,这会增加线程的安全性和活跃性上的风险。我们渴望提升性能,但是还是要以安全为首要的。首先要保证程序能够安全正常的运行,然后在需要的时候进行性能优化。这个要求很类似于重构,呵呵

2013-02-20 22:12:06 1191

原创 活跃性问题

JAVA应用程序无法从死锁中恢复,如果遇到这种情况我们就只能终止并重启它,并寄希望它不会再次出现。因此在设计的时候一定要排除那些可能导致死锁出现的条件。死锁不是每次都出现,但往往实在最糟糕的情况--高负载的时候出现。呵呵死锁对于死锁要注意由多个线程形成的环路的锁依赖关系,很容易导致死锁。锁顺序死锁当2个线程试图以不同的顺序调用相同的锁,就有可能发生顺序死锁。如:A--->锁

2013-02-19 22:51:41 1912

原创 任务执行与取消

任务执行任务是一组逻辑业务单元,通常是一些抽象的且离散的工作单元,线程则是使任务异步执行的机制。围绕“任务执行”来设计应用程序时,首先要做的就是找出清晰的任务边界。理想情况下任务之间应该是相互独立的,且不依赖于其他任务的状态、结果和边界效应。对于大多数服务器的应用程序而言,以独立的客户请求为边界。有2中任务执行策略:串行执行。所有任务都在一个线程中,顺序执行。串行的任务执行吞吐

2013-02-18 23:01:16 1015

原创 并发基础模块

JAVA提供了很多并发的基础模块,来帮助我们构建线程安全的类。这里做一下简要的介绍。帮助构建一个并发模块框架。同步容器类早起的Vector和HashTable都是同步容器。同步容器类,通过将它们的状态封装起来,并对每个公有方法都进行同步,使得每次都只有一个线程能访问容器的状态。同步容器类将并发的操作转换为串行的。当然同步容器是线程安全的。我们也可以使用同步封装器,Collectio

2013-02-13 23:11:18 369

原创 并发简介

简介线程是轻量级的进程。多数操作系统都是以线程作为基本的调度单位,而不是进程。如果没有明确的协同机制,线程彼此间是独立的。由于同一个进程内的所有线程都将彼此共享进程的内存地址空间,因此这些线程都能访问相同的变量并在同一个堆上分配对象,这就需要实现一种比在进程间共享数据粒度更细的数据共享机制。我们为什么要实现多个程序同时运行?资源利用公平性便利性线程的优势线程可以有效的降低程

2013-02-08 21:58:13 278

原创 String与StringBuilder

今天在突然想为什么在连接字符串时,StringBuffer或是StringBuilder(1.5开始)的速度要好于采用连接符“+”。有没有什么特殊的情况呢?java6对编译器对“+”操作做了优化处理后,是否也遵循上述情况呢?在java6之前,JAVA是如何处理String间的“+”操作呢?我们知道String保存的不是真正的值,它只是栈空间中一个指向堆空间具体内容的地址,且String是fin

2013-02-08 21:53:02 302

原创 Atomic

JAVA提供了一个原子化包,支持在单个变量上接触锁定的线程安全编程。效果应该要好于volatile,因为volatile只能保证提取最新的值,而原子化变量却可以保证变量内状态的操作的原子性。原子化的变量类型并不是真正对应的类型,如:AtomicBoolean与真正的Boolean,没有直接的关系,更无从与继承什么的亲密关系了。所以对于常见的类型的操作这里不一定会提供,这是需要注意的。而且由于原

2013-01-16 22:17:13 340

原创 同步(2)

在JAVA的语言规范中指出,为了获得最佳的速度,允许线程保存共享成员变量的私有拷贝,只有当线程进入或是离开同步代码块时才与共享成员变量的原始值对比,如果不同则修改为新的值。以上的规范说明了,每个线程在操作共享成员变量的时候是先将它处理为线程内的一个私有变量,这样每个线程在处理对应的共享成员变量时是互不影响的,而且在处理完成后将值回写到真实的成员变量上。这个过程及易导致同步问题。之前我们讨论

2012-12-26 23:16:38 283

原创 同步(1)

在多线程中,某些公用资源会被多个线程同时使用,但是如果不同的线程对同一个资源使用完全相反的操作或是改变状态等操作,那么会导致资源数据或是状态的不正确变化,为了避免此类问题,java提出了同步机制。synchronizedsynchronized是java提供的关键字,常用来修饰函数及其内的语句,这也就是我们平时所说的同步方法和同步块。该关键字通过锁定公共资源来达到资源同步的效果,任何时刻都

2012-12-22 21:57:41 212

原创 JAVA线程池

在java1.5之前的版本是没有线程池的,我们只能通过相关的容器自行开发代码来实现线程池功能。所幸从1.5开始,JDK提供了线程池的接口及其实现类,基本可以满足我们的使用需求。线程池应用场景在实际使用中,我们可能会涉及到大量线程的创建。比如,网站的某些请求,每个请求需要一个线程来支持,可能需要同时创建大量的线程。假设创建一个线程所需的实践是T1,线程执行时间是T2,线程的销毁时

2012-12-16 22:13:32 334

原创 多线程简介

线程是比进程更小的单位,一个进程可以由很多的线程组成。每个进程都有一段专用的内存区域,而线程间可以共享相同的内存区域(包括代码和数据),并利用这些共享单元来实现数据交换、实时通信和必要的同步操作。每个java程序都有一个默认的主线程。每个main方法可以启动一个线程,这个线程叫做“主线程”,然后可以通过“主线程”创建新的线程。正常的线程在创建后如果没有外部原因,生命周期不再受创建它的线程关联,

2012-12-03 22:25:00 375

原创 Queue

Queue是一个提供队列服务的集合。除实现了Collection的操作以外,队列还提供插入、提取和检查操作。一般情况下队列是FIFO的,但是也有一些特殊队列,如:优先队列就是依据提供的比较器或是按照自然顺序排列的。不过无论何种队列,其中的数据顺序都是有序的,我们都只可对它的头进行操作。看到上述对队列的描述,我们发现其实我们也可以使用List或是Set来完成这些功能。其实在java6之前的版本中

2012-11-21 23:22:08 315

原创 Set

Setset是一个不包含重复元素的collection。更正式的说,set不包含满足e1.equals(e2)的元素e1和e2,并且最多包哈一个null元素。需要注意的是如果把一个可变对象置于一个set中,随着可变对象的变化,可能导致set中存在有两个相同的对象(如:2个WeakHashMap对象,随着时间推移都会变为空对象),这样就违反了set的初始定义。所以我们至少是不允许一个set作

2012-11-18 22:33:03 400

原创 敏捷开发中的设计原则

敏捷性是以微小增量的方式构建软件,那么我们该如何设计软件呢?在敏捷团队中,全局视图和软件一起演化。每次迭代,团队都改进系统设计,使设计尽可能适合于当前系统。团队不会去花费许多时间去预测未来的需求和需要,也不会试图在今天就构建一些基础结构去支撑那些他们认为明天才会需要的特性。更愿意关注当前的系统结构,并使它尽可能的好。在《敏捷软件开发:原则、模式和实践》一书中提出几种设计原则:单一职责原

2012-11-17 22:13:56 1163

原创 软件腐化

随着时间的推移,各式各样的修改、新增需求会使软件变得越来越难以维护。软件逐渐的变得腐化了。但软件出现下面这些气味时,就表明软件正在腐化。僵化性(Rigidity)很难对系统进行改动,哪怕是最简单的,因为每个改动都会迫使许多对系统其他部分的改动。应该是代码的耦合太厉害了。脆弱性(Fragility)对系统的改动会导致系统中和改动的地方在概念上无关的许多地方出现问题。导致这

2012-11-16 23:07:04 1110

原创 极限编程简介

现在我们有很多敏捷过程:SCRUM,Crystal,特征驱动开发(Feature Driven Development,FDD),自适应软件开发(Adaptive Software Development,ADP)以及极限编程(eXtreme Programming,XP)。今天这里简述一下极限编程。极限编程是敏捷方法中最著名的一个。由一系列简单却互相依赖的实践组成。客户作为团队成

2012-11-16 21:57:38 642

翻译 敏捷宣言遵循的原则

敏捷宣言遵循的原则我们遵循一下原则:我们最优先要做的是通过尽早的、持续的交付有价值的软件来使客户满意。即使到了开发的后期,我们也欢迎需求的改变。敏捷过程是利用变化来为客户创造竞争优势。经常性的交付可以工作的软件,交付的间隔可以是几周到几个月,当然,交付的间隔越短越好。在整个项目开发期间,业务人员和开发人员必须天天都在一起工作。围绕被激励起来的个体来构建项目。给他们提供所需的环境和支持,

2012-11-13 22:46:29 364

空空如也

空空如也

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

TA关注的人

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