![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
文章平均质量分 71
weeweee
1、5年java程序开发经验,熟悉JavaEE及其相关技术;3年研发团队管理及软件设计经验<br/>2、享受编程的乐趣,喜欢简洁的代码,热爱阅读<br/>3、善于学习新的知识,对新技术上手较快;有较强的环境适应能力,具有良好的团队协作精神,能吃苦耐劳,性格活泼开朗,善于与人相处
展开
-
Formatter使用
Formatter格式化Java提供了对数值、字符串和日期/时间数据的常规格式和特定于语言环境的输出的支持,主要是自由输出。java.util.Formatter(1.5后提供)转换为指定格式的字符串,用于实现printf和String.format()。以下是其中格式化公式format的介绍整数格式化公式:%[index$][标识][最小宽度]转换方式index$:指定是第几个参转载 2012-09-10 10:35:07 · 1171 阅读 · 0 评论 -
并发简介
简介线程是轻量级的进程。多数操作系统都是以线程作为基本的调度单位,而不是进程。如果没有明确的协同机制,线程彼此间是独立的。由于同一个进程内的所有线程都将彼此共享进程的内存地址空间,因此这些线程都能访问相同的变量并在同一个堆上分配对象,这就需要实现一种比在进程间共享数据粒度更细的数据共享机制。我们为什么要实现多个程序同时运行?资源利用公平性便利性线程的优势线程可以有效的降低程原创 2013-02-08 21:58:13 · 287 阅读 · 0 评论 -
String与StringBuilder
今天在突然想为什么在连接字符串时,StringBuffer或是StringBuilder(1.5开始)的速度要好于采用连接符“+”。有没有什么特殊的情况呢?java6对编译器对“+”操作做了优化处理后,是否也遵循上述情况呢?在java6之前,JAVA是如何处理String间的“+”操作呢?我们知道String保存的不是真正的值,它只是栈空间中一个指向堆空间具体内容的地址,且String是fin原创 2013-02-08 21:53:02 · 310 阅读 · 0 评论 -
并发基础模块
JAVA提供了很多并发的基础模块,来帮助我们构建线程安全的类。这里做一下简要的介绍。帮助构建一个并发模块框架。同步容器类早起的Vector和HashTable都是同步容器。同步容器类,通过将它们的状态封装起来,并对每个公有方法都进行同步,使得每次都只有一个线程能访问容器的状态。同步容器类将并发的操作转换为串行的。当然同步容器是线程安全的。我们也可以使用同步封装器,Collectio原创 2013-02-13 23:11:18 · 378 阅读 · 0 评论 -
任务执行与取消
任务执行任务是一组逻辑业务单元,通常是一些抽象的且离散的工作单元,线程则是使任务异步执行的机制。围绕“任务执行”来设计应用程序时,首先要做的就是找出清晰的任务边界。理想情况下任务之间应该是相互独立的,且不依赖于其他任务的状态、结果和边界效应。对于大多数服务器的应用程序而言,以独立的客户请求为边界。有2中任务执行策略:串行执行。所有任务都在一个线程中,顺序执行。串行的任务执行吞吐原创 2013-02-18 23:01:16 · 1104 阅读 · 0 评论 -
活跃性问题
JAVA应用程序无法从死锁中恢复,如果遇到这种情况我们就只能终止并重启它,并寄希望它不会再次出现。因此在设计的时候一定要排除那些可能导致死锁出现的条件。死锁不是每次都出现,但往往实在最糟糕的情况--高负载的时候出现。呵呵死锁对于死锁要注意由多个线程形成的环路的锁依赖关系,很容易导致死锁。锁顺序死锁当2个线程试图以不同的顺序调用相同的锁,就有可能发生顺序死锁。如:A--->锁原创 2013-02-19 22:51:41 · 1958 阅读 · 0 评论 -
并发性能和可伸缩性
线程的主要目的就是提高程序的运行性能。此外,线程还可以使程序在运行现有任务的情况下立即开始处理新的任务,从而提高系统的响应性。性能的思考提升性能意味着可以用更少的资源做更多的事情。但是提升性能会带来额外的复杂度,这会增加线程的安全性和活跃性上的风险。我们渴望提升性能,但是还是要以安全为首要的。首先要保证程序能够安全正常的运行,然后在需要的时候进行性能优化。这个要求很类似于重构,呵呵原创 2013-02-20 22:12:06 · 1203 阅读 · 0 评论 -
显式锁
在java5之前,在协调对共享对象的访问时可以使用的机制只有synchronized和volatile。5新增了一种机制,ReentrantLock。与之前的机制不同的是,ReentrantLock不是一种替代内置锁的机制,而是当内置锁机制不适用时,作为一种可选择的高级功能。LockLock是显式锁的抽象接口,提供了加锁、解锁等功能。它提供了一种无条件的、可轮询的、定时的以及可中断的锁获取原创 2013-02-21 22:10:06 · 947 阅读 · 0 评论 -
原子变量和非阻塞同步机制
现在并发算法领域多数研究都侧重于非阻塞算法,这种算法利用底层的原子机器指令代替锁来确保数据在并发中的一致性。非阻塞算法在设计和实现上比锁方案要复杂的多,但是它能够提供更好的可伸缩性和活跃性。我们可以使用原子变量来构建高效的非阻塞算法。原子变量不光可以用在构建非阻塞算法上,它还可以当做volatile同时还可以支持原子更新操作。锁的劣势现在JVM对非竞争的锁获取和释放等操作进行了极大的优原创 2013-02-22 23:00:38 · 509 阅读 · 0 评论 -
运行时数据区域
java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途及创建和销毁时间,有的随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。这里有个图其中方法区和堆,是所有线程共享的。虚拟机栈、本地方法栈和程序计数器由线程独享的。程序计数器程序计数器是一块较小的内存空间,它的作用可以看作是当前线原创 2013-04-22 23:04:53 · 530 阅读 · 0 评论 -
垃圾回收
垃圾收集(Garbage Collection,GC)主要关注堆和方法区,回收满足回收条件的空间。对象回收对于堆上的对象实例,垃圾收集器在进行回收操作前,首先要判别实例对象是否被引用,准确的是判别对象是否“死亡”,因为有引用不代表不需要回收。判别对象时候被引用有2个算法:引用计数法给对象添加一个引用计数器,每当有一个地方引用它时,计数值就加1;当引用失效时就减1。任何时候如果计原创 2013-04-24 21:26:16 · 526 阅读 · 0 评论 -
java内存模型简述
JAVA内存模型我们知道计算机在实现多线程操作时,不仅仅需要CPU处理器并发操作,更重要的是并发时,CPU寄存器、高速Cache同主内存间的数据交互。只有保证了这些才能保证安全的线程操作。C语言需要直接操作硬件来完成这些,所以它一旦更换机子就不行了。那么JAVA是如何保证的呢?JAVA虚拟机通过内存模型(JMM)屏蔽掉各种硬件和操作系统的内存访问差异,以实现让JAVA程序在各种平台下都能达原创 2013-04-27 22:17:09 · 778 阅读 · 0 评论 -
线程安全和锁优化
线程安全当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象就是线程安全的。JAVA线程安全不可变通过java的final关键字来事项。对于基本数据类型,直接用final修饰即可保证不可变性;但是对于对象,需要保证对象的行为不会对其状态产生任何影响原创 2013-04-28 22:32:20 · 1425 阅读 · 0 评论 -
类初始化时机
对于类加载过程中初始化阶段,虚拟机严格规定了有且只有四种情况必须立即对类进行“初始化”:遇到new、getstatic、putstatic和invokestatic这4条指令码时,如果类没有初始化,则需要先进行初始化。这4条指令对应的java场景是:使用new关键字实例化对象读取或设置一个静态字段,不包括被final修饰的、已在编译器把结果放入常量池的静态字段调用一个静态方法使原创 2013-05-01 21:44:35 · 777 阅读 · 1 评论 -
在多线程下的long和double
在看一些代码的时候,会发现在定义long型和double型的变量时,会在前面加上volatile关键字,当然也会看到在其它原子类型的变量前加上这个关键字,但这里要说的还是有区别的。 在java中,java的内存模型要求,变量的读取操作和写入操作都必须是原子操作的,但是对于非volatile类型的long和double有些不同,因为这两个变量是64位存储,JVM允许将64位的读操作或转载 2013-05-28 23:14:29 · 726 阅读 · 0 评论 -
应该使用32位还是64位JVM
应用使用32位的JVM,还是应该使用64位的JVM,我自己以前还真没想过,大家都想过了吗?本文是Plumbr中的一篇博文,为大家提了个醒。(2012.11.27最后更新) 在我的企业级软件开发职业生涯中,我多次面对这个问题。每隔一段时间我不得不建议配置一个新的特定环境。而往往该问题部分与"我应该使用32位还是64位JVM?"这一问题有关。老实说,一开始我是靠掷硬币来解决的,而不是给出转载 2013-05-28 23:11:32 · 980 阅读 · 0 评论 -
final详解
在java中,final关键字可以有如下的用处: final关键字可以被加到类的声明中,final类是不允许继承的;final关键字可以被加到方法声明中,final方法是不允许重写的(override),这个效果同私有方法一样;final关键字可以被家到属性或者变量的声明中,final属性或者变量一旦赋值之后就不允许再发生变化。对于基本类型(primitive type),比如int、do转载 2013-06-02 22:06:54 · 866 阅读 · 0 评论 -
Atomic
JAVA提供了一个原子化包,支持在单个变量上接触锁定的线程安全编程。效果应该要好于volatile,因为volatile只能保证提取最新的值,而原子化变量却可以保证变量内状态的操作的原子性。原子化的变量类型并不是真正对应的类型,如:AtomicBoolean与真正的Boolean,没有直接的关系,更无从与继承什么的亲密关系了。所以对于常见的类型的操作这里不一定会提供,这是需要注意的。而且由于原原创 2013-01-16 22:17:13 · 349 阅读 · 0 评论 -
JAVA线程池
在java1.5之前的版本是没有线程池的,我们只能通过相关的容器自行开发代码来实现线程池功能。所幸从1.5开始,JDK提供了线程池的接口及其实现类,基本可以满足我们的使用需求。线程池应用场景在实际使用中,我们可能会涉及到大量线程的创建。比如,网站的某些请求,每个请求需要一个线程来支持,可能需要同时创建大量的线程。假设创建一个线程所需的实践是T1,线程执行时间是T2,线程的销毁时原创 2012-12-16 22:13:32 · 342 阅读 · 0 评论 -
同步(2)
在JAVA的语言规范中指出,为了获得最佳的速度,允许线程保存共享成员变量的私有拷贝,只有当线程进入或是离开同步代码块时才与共享成员变量的原始值对比,如果不同则修改为新的值。以上的规范说明了,每个线程在操作共享成员变量的时候是先将它处理为线程内的一个私有变量,这样每个线程在处理对应的共享成员变量时是互不影响的,而且在处理完成后将值回写到真实的成员变量上。这个过程及易导致同步问题。之前我们讨论原创 2012-12-26 23:16:38 · 292 阅读 · 0 评论 -
Final
Final final从它的字面含义“最终的,最后的”可以理解,这个关键字代表的不可变动。 它可以用来修饰变量、参数、方法和类。变量 当变量类型为基本类型时,指定该变量为常量,在编译期指定该变量是不可变的。对于编译期常量的这种情况,编译器可以将该常量值代入任何可能用到它的计算式中,也就是说,可以在编译期就执行计算式,这减轻了一些运行时的负担。编原创 2012-09-10 16:22:57 · 277 阅读 · 0 评论 -
Format使用
Format java.text.Format做为一个抽象类,有二个抽象方法,format(Objectobj, StringBuffer toAppendTo,FieldPosition pos):格式化一个对象,并将得到的文本追加到给定的字符缓冲区。是将obj格式化为字符串,并加入到toAppendTo中。parseObject(Stringsource, ParsePositio转载 2012-09-10 10:41:01 · 1335 阅读 · 0 评论 -
Static
Static Static有“静态的”之意。用来修饰变量和方法或是生成一个静态的代码块,在特殊情况下也可以用来修饰类。变量 用static修饰的变量不属于类的实例,而是所有实例共享的(可以当全局变量使,但实际上java是没有全局变量的)。利用ruby中的概念可以理解为类变量和实例变量的区别。只要类被加载,JVM就能根据类名在运行时数据区的方法区内定找到他原创 2012-09-11 16:26:16 · 278 阅读 · 0 评论 -
正则表达式
正则表达式 正则表达式(regularexpression)用于指定字符串的模式,可以在任何需要定位匹配某种特定模式的字符串的情况下使用正则表达式。从1.4开始,java增加了包java.util.regex来处理正则表达式。基础语法字符构造匹配x字符 x\\反斜线字符原创 2012-09-29 15:07:55 · 486 阅读 · 0 评论 -
类加载
类加载 类加载是java语言提供的最强大的机制之一。尽管在日常的使用中不需要我们关注类加载的机制,但是了解其背后的机制对我们理解java虚拟机的连接模型和java语言的动态性都有很大帮助。 在JVM中一个类的全名+它的类加载器实例是唯一的标识,不同的类加载器加载的相同类被置于不同的命名空间。所以,对同一个类被不同的类加载器实现的实例使用equles()返回的肯定是fa原创 2012-09-14 15:17:31 · 295 阅读 · 0 评论 -
equals与hashcode
Equals Equals是Object类的一个方法,指示某个其他对象是否与此对象“相等”。 Java语言规范要求equals方法具有以下特性:1、 自反性。对于任何非空引用x,x.equals(x)应该为true2、 对称性。对于任何引用x和y,当且仅当y.equals(x)返回true,x.equals(y)也应该返回true。3、 传递性。对于任何引用x、y原创 2012-09-18 10:08:28 · 271 阅读 · 0 评论 -
clone
Clone Clone用来创建并返回此对象的一个副本。又分为浅层复制和深层复制。一般来说,对于任何对象x,如果表达式x.clone() != x是正确的,则表达式x.clone().getClass() == x.getClass()将是true,但这不是绝对条件。一般情况是,x.clone().equals(x)返回true。对象的类型 对象的类型有2种原创 2012-09-18 21:54:50 · 315 阅读 · 0 评论 -
泛型
泛型 泛型(Generic type或者 generics)是对Java语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样。为什么要使用泛型 使用泛型意味着编写的代码可以被很多不同类型的对象所重用。在JAVA 5.0之前,java泛型原创 2012-09-20 22:10:25 · 661 阅读 · 0 评论 -
List及其实现类
ListList是Java集合Collection的重要组成部分。代表了有序的集合,也可以称为序列。对于一个有序序列,我们可以精确的控制每一个元素的位置,并通过元素的整数索引(索引为非负)来访问和检索元素。 对于序列来说,允许存在重复的元素,严格一些来说就是允许equals方法返回true的元素存在,同时也允许NULL值的存在,这样就会有一个很有趣的现象,即一个序列中存在有原创 2012-10-14 16:53:01 · 1062 阅读 · 0 评论 -
Map
Map 将键映射到值的对象。对于一个映射来说键不能重复,一个键不能对应到多个值上。 一般情况下通过equal来判别键是否重复,但是也存在特殊的Map使用“==”来判别是否重复,如IdentityHashMap。 Map有3中collection视图。①键集②值集③键-值映射关系集。由于实现机制的不同,有些实现类可以保证视图的迭代顺序,如T原创 2012-10-21 21:08:09 · 507 阅读 · 0 评论 -
Java引用
最近在看java引用方面的东西,发现一篇博客写的很详尽,所以自己就省点事,转载过来,O(∩_∩)O~http://blog.csdn.net/silentbalanceyh/article/details/44683681.Java垃圾回收器概述 Java2平台里面引入了java.lang.ref包,这个包中的类可以让我们引用对象,而是的这些对象不用停留在内存中。不仅仅如此,这些转载 2012-10-21 21:48:34 · 778 阅读 · 0 评论 -
Set
Setset是一个不包含重复元素的collection。更正式的说,set不包含满足e1.equals(e2)的元素e1和e2,并且最多包哈一个null元素。需要注意的是如果把一个可变对象置于一个set中,随着可变对象的变化,可能导致set中存在有两个相同的对象(如:2个WeakHashMap对象,随着时间推移都会变为空对象),这样就违反了set的初始定义。所以我们至少是不允许一个set作原创 2012-11-18 22:33:03 · 412 阅读 · 0 评论 -
多线程简介
线程是比进程更小的单位,一个进程可以由很多的线程组成。每个进程都有一段专用的内存区域,而线程间可以共享相同的内存区域(包括代码和数据),并利用这些共享单元来实现数据交换、实时通信和必要的同步操作。每个java程序都有一个默认的主线程。每个main方法可以启动一个线程,这个线程叫做“主线程”,然后可以通过“主线程”创建新的线程。正常的线程在创建后如果没有外部原因,生命周期不再受创建它的线程关联,原创 2012-12-03 22:25:00 · 392 阅读 · 0 评论 -
Queue
Queue是一个提供队列服务的集合。除实现了Collection的操作以外,队列还提供插入、提取和检查操作。一般情况下队列是FIFO的,但是也有一些特殊队列,如:优先队列就是依据提供的比较器或是按照自然顺序排列的。不过无论何种队列,其中的数据顺序都是有序的,我们都只可对它的头进行操作。看到上述对队列的描述,我们发现其实我们也可以使用List或是Set来完成这些功能。其实在java6之前的版本中原创 2012-11-21 23:22:08 · 326 阅读 · 0 评论 -
同步(1)
在多线程中,某些公用资源会被多个线程同时使用,但是如果不同的线程对同一个资源使用完全相反的操作或是改变状态等操作,那么会导致资源数据或是状态的不正确变化,为了避免此类问题,java提出了同步机制。synchronizedsynchronized是java提供的关键字,常用来修饰函数及其内的语句,这也就是我们平时所说的同步方法和同步块。该关键字通过锁定公共资源来达到资源同步的效果,任何时刻都原创 2012-12-22 21:57:41 · 221 阅读 · 0 评论 -
Hibernate与MyBatis比较
最近做了一个Hibernate与MyBatis的对比总结,希望大家指出不对之处。第一章 Hibernate与MyBatisHibernate 是当前最流行的O/R mapping框架,它出身于sf.net,现在已经成为Jboss的一部分。 Mybatis 是另外一种优秀的O/R mapping框架。目前属于apache的一个子项目。MyBatis 参考资料官网:转载 2013-08-27 17:17:07 · 2975 阅读 · 0 评论