我是一名初级程序员,工作一年多。还记得刚毕业,踏入社会的时候,面临着很多工作上尴尬和困惑。首当其冲的便是在学校学的知识并不够用,甚至并不管用。于是学习新技术成了重点解决的问题。其实IT行业推陈出新的速度是很快的,学习新技术并不是初级程序员独有的问题,但是他们的处境是更为困难的,缺乏经验和指导,如何迈出第一步,如何筛选信息,如何深入学习都是摆在我们前面的一道道题目。下面就我的经验来谈谈程序员学习的策略吧。
1、明确目标
首先在学习之前要设定明确的学习目标。什么是明确的目标呢,例如工作的项目需要你能熟练的编写javascript,那么你的目标很明确,就是学习javascript。如果目标设定为网页前端技术,那么这个目标是很模糊的,因为一种技术有很多的具体的实现方法,所用的具体技术也大有不同。你还需要对目标作进一步的细化,一定要具体到一门语言或一种解决方案。当然你目标设定的前提肯定是要用在工作上,如果学的技术不能用在生产上,那么你学习的东西是没有意义,时间也浪费了,你还不能确定你掌握到了什么程度。如果你无法明确自己的目标,可以看第2点。
2、广泛涉猎,浅尝辄止。
如果你对一个 ...
在编写网络游戏时,最终会出现UDP与TCP的问题。
通常,您会听到人们说这样的话:“除非您在做动作游戏,否则可以使用TCP”或“您可以将TCP用于您的MMO,因为看一下WOW –它使用TCP!”
不幸的是,这些意见不能正确反映TCP / UDP问题的复杂性。
背景首先,让我指出我的背景主要是TCP编程。我在领先的扑克网络的游戏服务器上工作了多年,通常在高峰期,每个服务器实例上运行4,000 – 10,000个连接(多个实例在一台计算机上运行)时没有任何问题。在我看来,TCP是安全且众所周知的替代方法。
尽管如此,我们当前的项目正在使用UDP,但是我们无法使其与TCP一起正常工作。实际上,它始于TCP,但是当很明显我们无法获得想要的连接质量时,我们切换到UDP。
TCP在实践中意味着什么从理论上讲,TCP的优点如下:
简单持久的连接
可靠的消息传递
任意大小的数据包
任何具有TCP实际操作经验的人都知道,可靠的实现需要处理许多不太明显的极端情况,例如断开连接检测,由于客户端响应缓慢而导致的数据包拥塞,与建立连接有关的各种DoS攻击向量,阻塞与非-阻塞IO等
尽管具有前期的易 ...
各位为英语而郁闷的兄弟姐妹们:
自从考完GRE和TOEFL以后,心有所感,本想写点心得,但是因为太懒没写成。今日风雨如晦,心中又有所感,于是一舒笔墨,写下我学英语的方法。俺知道有很多兄弟姐妹们和曾经的我一样因为英语而郁闷,小小心得,也算造福后人,为自己积累一点功德~~
方法之前,先说说俺学英语的历史:
开篇:俺的英语之路
我大概从小学二年级开始学英语,当时在老爸的逼迫之下每天傍晚六点准时坐在电视机前,和“少儿家庭英语”里面那个奇丑无比的老太婆读一些奇无智商的单词句子。有一天放学和同学捉蝴蝶捉得忘了时间,错过了“老太婆”的课,被老爸一脚踢在小腿上三寸下三寸处,从腿面一直黑到腿背。现在已经不记得他说过些什么了,只记得他被俺奶奶狠狠骂了一顿,从此以后再也不敢逼俺学英语了~后来又有一天老爸问:你是不是有时会把英语和拼音混淆?我张着嘴呆了5秒钟,然后毫不犹豫的回答:是!此后俺小学阶段再也不用和老太婆念那几本没智商的“少儿家庭英语”了。其实俺作为广西百色市第七小学三年级“尖子班”中的“尖子生”,说俺会把区区英语和区区拼音混在一起,简直就是侮辱俺的智商。只不过少了每天六点和老太 ...
在阎宏博士的《JAVA与模式》一书中开头是这样描述解释器(Interpreter)模式的:
解释器模式是类的行为模式。给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。
解释器模式的结构下面就以一个示意性的系统为例,讨论解释器模式的结构。系统的结构图如下所示:
模式所涉及的角色如下所示:
(1)抽象表达式(Expression)角色: 声明一个所有的具体表达式角色都需要实现的抽象接口。这个接口主要是一个interpret()方法,称做解释操作。
(2)终结符表达式(Terminal Expression)角色: 实现了抽象表达式角色所要求的接口,主要是一个interpret()方法;文法中的每一个终结符都有一个具体终结表达式与之相对应。比如有一个简单的公式R=R1+R2,在里面R1和R2就是终结符,对应的解析R1和R2的解释器就是终结符表达式。
(3)非终结符表达式(Nonterminal Expression)角色: 文法中的每一条规则都需要一个具体的非终结符表达式,非终结符表达式 ...
在网络上开销最昂贵的资源就是客户端与服务器往返的请求与响应,JDBC中类似的一种情况就是对数据库的调用,如果你在做数据插入、更新、删除操作,可以使用executeBatch()方法减少数据库调用次数,如:
Statement pstmt = conn.createStatement();
pstmt.addBatch("insert into settings values(3,'liu')");
pstmt.addBatch("insert into settings values(4,'zhi')");
pstmt.addBatch("insert into settings values(5,'jun')");
pstmt.executeBatch();
但不幸的是对于批量查询,JDBC并没有内建(built-in)的方法,而且JDBC执行批处理的时候也不能有SELECT语句,如:
Statement pstmt = conn.createStatement();
pst ...
java源码分析
未读JDK源码中Set类是我们开发过程中经常用到的,那么本文将会向你介绍JDK源码中Set类的一些构造,使我们在编程中高效的应用。
JDK源码分析Set类,因为Set类是经常要用到的,那我们知道JDK源码中Set类在其中不可以有相同的元素,那么判断这个元素是否相同是如何实现的呢,我们看下下面这张图:
对JDK源码分析之Set类在这张类图上,首先我们看见一个经典模式的应用,那就是适配器模式,我们把map接口的对象,包装成为了Set的接口;在代码中,我们来分析一下;
首先,我们看一下HashSet
private transient HashMap map;
// Dummy value to associate with an Object in the backing Map
private staticfinal Object PRESENT = new Object();
可见,他适配了HashMap,那么他的功能是如何委托给HashMap结构的呢?
public boolean add(E e) {
return map.put(e, PRESENT ...
在JDK6与JDK7这两个版本中,substring(int beginIndex, int endIndex)方法是不同的. 了解两个版本间的区别可以让你更好地使用它们. 为简单起见,本文中以 substring() 表示 substring(int beginIndex, int endIndex).
1. substring()功能简介String对象的substring(int beginIndex, int endIndex)方法返回此对象的一个子串,从beginIndex 开始,一直到 endIndex-1 结束,共 (endIndex - beginIndex)个字符。新手提示: 1.1 String 的索引和数组一样,都是从0开始. 1.2 注意,方法名字是substring(),全小写. 1.3 有个重载方法是substring(int beginIndex),从beginIndex索引处开始,取得子字符串.
String x = "abcdef";
int begin=1;
int end=3;
x = x.subst ...
什么是事务处理
事务是计算机应用中不可或缺的组件模型,它保证了用户操作的原子性 ( Atomicity )、一致性 ( Consistency )、隔离性 ( Isolation ) 和持久性 ( Durabilily )。关于事务最经典的示例莫过于信用卡转账:将用户 A 账户中的 500 元人民币转移到用户 B 的账户中,其操作流程如下1. 将 A 账户中的金额减少 5002. 将 B 账户中的金额增加 500这两个操作必须保正 ACID 的事务属性:即要么全部成功,要么全部失败;假若没有事务保障,用户的账号金额将可能发生问题:假如第一步操作成功而第二步失败,那么用户 A 账户中的金额将就减少 500 元而用户 B 的账号却没有任何增加(不翼而飞);同样如果第一步出错 而第二步成功,那么用户 A 的账户金额不变而用户 B 的账号将增加 500 元(凭空而生)。上述任何一种错误都会产生严重的数据不一致问题,事务的缺失对于一个稳定的生产系统是不可接受的。
J2EE 事务处理方式
1. 本地事务:紧密依赖于底层资源管理器(例如数据库连接 ),事务处理局限在当前事务资源内。此种事务处理方式不 ...
在《Java虚拟机规范》之中,详细描述了虚拟机指令集中每条指令的执行过程、执行前后对操作数栈、对局部变量表的影响等细节。这些细节描述与Sun的早期虚拟机(Sun Classic VM)高度吻合,但随着技术的发展,高性能虚拟机真正的细节实现方式已经渐渐与虚拟机规范所描述产生越来越大的差距,虚拟机规范中的描述逐渐成了虚拟机实现的“概念模型”——即实现只能保证规范描述等效。
基于上面的原因,我们分析程序的执行语义问题(虚拟机做了什么)时,在字节码层面上分析完全可行,但分析程序的执行行为问题(虚拟机是怎样做的、性能如何)时,在字节码层面上分析就没有什么意义了,需要通过其他方式解决。
准备工作分析程序如何执行,通过软件调试工具(GDB、Windbg等)来断点调试是最常见的手段,但是这样的调试方式在JVM中会遇到很大困难,因为大量执行代码是通过JIT编译器动态生成到CodeBuffer中的,没有很简单的手段来处理这种混合模式的调试(不过相信虚拟机开发团队内部肯定是有内部工具的)。因此我们要通过一些曲线手段来解决问题,基于这种背景下,本文的主角——HSDIS插件就正式登场了。
当然,既然是通过-XX ...
多线程-并发
未读单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。正是由于这个特点,单例对象通常作为程序中的存放配置信息的载体,因为它能保证其他对象读到一致的信息。例如在某个服务器程序中,该服务器的配置信息可能存放在数据库或文件中,这些配置数据由某个单例对象统一读取,服务进程中的其他对象如果要获取这些配置信息,只需访问该单例对象即可。这种方式极大地简化了在复杂环境下,尤其是多线程环境下的配置管理,但是随着应用场景的不同,也可能带来一些同步问题。
本文将探讨一下在多线程环境下,使用单例对象作配置信息管理时可能会带来的几个同步问题,并针对每个问题给出可选的解决办法。
问题描述在多线程环境下,单例对象的同步问题主要体现在两个方面,单例对象的初始化和单例对象的属性更新。
本文描述的方法有如下假设:
单例对象的属性(或成员变量)的获取,是通过单例对象的初始化实现的。也就是说,在单例对象初始化时,会从文件或数据库中读取最新的配置信息。
其他对象不能直接改变单例对象的属性,单例对象属性的变化来源于配置文件或配置数据库数据的变化。
1.1 ...
