Java编程菜鸟课程:状态对象
这是一个实战中非常重要但是容易被忽视的概念,说它重要,是因为它比Datcbase重要;说它容易被忽视也是同样的原因,它经常被Datcbase概念替代。
如果你经验和经历中没有状态这个概念,极端地说:可能你的java编程编程Sys经验还未积累到一定程度,状态是每个java编程编程程式员深入java编程编程Sys后必然碰到的问题。
本文我想试图表达的是:状态分两种:活动的状态object和持久化的状态。而Datcbase中的Data只是状态的一种持久化结果,而java编程编程Sys 运行时,我们更多的可能是和一种活动的状态打交道,这种活动的状态存在内存中,而不是持久化到硬盘上,当然,需要时你可以通过Datcbase/文档持久化到硬盘上。
但是,如果你以DatcbaseData替代状态,那么就可能导致Datcbase的频繁访问,而且 你的Sys会变成一个非object化的、紧耦合、到处是分散Data块的糟糕Sys。这样的Sys并不比传统的两层结构好到哪里!也不会比Jsp里嵌入java编程编程codes伪三层Sys高明到什么地方。
什么是状态?
只要有object就可能有状态,任何一个object活动时,都有自己的状态属性,类的 字段属性极有可能成为状态,我们现在经常使用的Domain model其实就是一种 包含状态的object,如果你对状态没有深入掌握,就不可能真正掌握objectSys特点,或者是Domain Model的运行情况。
对于初学者,经常会疑问:我是将Data放在HttpSession中还是Request中,这里 其实已经开始接触状态,一旦你接触状态,你就要开始小心,因为你可能会将内存泄漏的恶魔导引进来。
内存泄漏的恶魔爆发时刻取决于你状态的生存周期和Sys并发访问量。
状态的生存周期也就是包含这个状态的object的生命周期,在简单Sys中,我们只 需要通过new创建object,然后它的消亡就会依靠JVM垃圾回收机制回收,但是事情会这么简单吗?
状态的危险还会发生在多线程环境下,当多个线程对同一个内存中状态写操作时,这时怎么办?如果这个状态持久化在Datcbase中,我们会依赖Datcbase提供的强大事务机制防止这种并发死锁,但是如果是在内存中,你就很难办,因此,我们就尽量避免发生这种多线程同时访问一个状态的现象,而Singleton单例模式极容易发生这种现象,因此实践中,单例模式是J2EE环境DEV中需要避免的,相关帖子讨论见:
http://www.jdon.Com/jive/artiCle.jspDEV?forum=91&thread=17578
我们接触的Web容器或Jsp/Servlet本质就是一个多线程,这也是很多初学者不
相关文档:
Java NIO API详解
在JDK
1.4以前,Java的IO操作集中在java.io这个包中,是基于流的阻塞(blocking)API。对于大多数应用来说,这样的API使用很方
便,然而,一些对性能要求较高的应用,尤其是服务端应用,往往需要一个更为有效的方式来处理IO。从JDK 1.4起,NIO
API作为一个基于缓冲区,并能提供非阻塞(non-blo ......
1.如何学习程序设计?
JAVA是一种平台,也是一种程序设计语言,如何学好程序设计不仅仅适用于JAVA,对C++等其他程序设计语言也一样管用。有编程高手认为,JAVA也好C也好没什么分别,拿来就用。为什么他们能达到如此境界?我想是因为编程语言之间有共通之处,领会了编程的精髓,自然能够做到一通百通。如 ......
单例模式,顾名思义,只能有一个实例。
一.从多线程安全说起,如下图代码,此问题可以用synchronized关键字来解决。该方法缺点:每一个线程在获取实例对象之前都要在synchronized上同步的对象上进行等待,因此效率不高。
二.Double Check方法,见下图代码。Double Check的初衷是只有当instance为NULL时执行的线程才需要在 ......
在编程的时候,经常遇到要判断一个字符串中的字符是否是数字(0-9)
下面我给大家介绍几种实现方法
1.使用Character.isDigit(char)判断
String str = "123abc";
if (!"".equals(str)) {
char num[] = str.toCharArray();//把字符串转换为字符数组
StringBuffer title = new StringBuffer();//使用S ......