深入理解Java内存模型(一)——基础

并发编程模型的分类 在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。 在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信。在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信。 同步是指程序用于控制不同线程之间操作发生相对顺序的机制。在共享内存并发模型里,同步是显式进行的。程序员必须显式指定某个方法或某段代码需要在线程之间互斥执行。在消息传递的并发模型里,由于消息的发送必须在消息的接收之前,因此同步是隐式进行的。 Java的并发采用的是共享内存模型,Java线程之间的通信总是隐式进行,整个通信过程对程序员完全透明。如果编写多线程程序的Java程序员不理解隐式进行的线程之间通信的工作机制,很可能会遇到各种奇怪的内存可见性问题。 Java内存模型的抽象 在java中,所有实例域、静态域和数组元素存储在堆内存中,堆内存在线程之间共享(本文使用“共享变量”这个术语代指实例域,静态域和数组元素)。局部变量(Local variables),方法定义参数(java语言规范称之为formal method parameters)和异常处理器参数(exception handler parameters)不会在线程之间共享,它们不会有内存可见性问题,也不受内存模型的影响。 Java线程之间的通信由Java内存模型(本文简称为JMM)控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化。Java内存模型的抽象示意图如下: 从上图来看,线程A与线程B之间如要通信的话,必须要经历下面2个步骤: 首先,线程A把本地内存A中更新过的共享变量刷新到主内存中去。 然后,线程B到主内存中去读取线程A之前已更新过的共享变量。 下面通过示意图来说明这两个步骤: 如上图所示,本地内存A和B有主内存中共享变量x的副本。假设初始时,这三个内存中的x值都为0。线程A在执行时,把更新后的x值(假设值为1)临时存放在自己的本地内存A中。当线程A和线程B需要通信时,线程A首先会把自己本地内存中修改后的x值刷新到主内存中,此时主内存中的x值变为了1。随后,线程B到主内存中去读取线程A更新后的x值,此时线程B的本地内存的x值也变为了1。 从整体来看,这两个步骤实质上是线程A在向线程B发送消息,而且这个通信过程必须要经过主内存。JMM通过控制主内存与每个线程的本地内存之间的交互,来为java程序员提供内存可见性保证。 重排序 在执行程序时为了提高性能,编译器和处理器常常会对指令做重排序。重排序分三种类型: 编译器优化的重排序。编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。 指令级并行的重排序。现代处理器采用了指令级并行技术(Instruction-Level Parallelism, ILP)来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。 内存系统的重排序。由于处理器使用缓存和读/写缓冲区,这使得加载和存储操作看上去可能是在乱序执行。 从java源代码到最终实际执行的指令序列,会分别经历下面三种重排序: 上述的1属于编译器重排序,2和3属于处理器重排序。这些重排序都可能会导致多线程程序出现内存可见性问题。对于编译器,JMM的编译器重排序规则会禁止特定类型的编译器重排序(不是所有的编译器重排序都要禁止)。对于处理器重排序,JMM的处理器重排序规则会要求java编译器在生成指令序列时,插入特定类型的内存屏障(memory barriers,intel称之为memory fence)指令,通过内存屏障指令来禁止特定类型的处理器重排序(不是所有的处理器重排序都要禁止)。 JMM属于语言级的内存模型,它确保在不同的编译器和不同的处理器平台之上,通过禁止特定类型的编译器重排序和处理器重排序,为程序员提供一致的内存可见性保证。 处理器重排序与内存屏障指令 现代的处理器使用写缓冲区来临时保存向内存写入的数据。写缓冲区可以保证指令流水线持续运行,它可以避免由于处理器停顿下来等待向内存写入数据而产生的延迟。同时,通过以批处理的方式刷新写缓冲区,以及合并写缓冲区中对同一内存地址的多次写,可以减少对内存总线的占用。虽然写缓冲区有这么多好处,但每个处理器上的写缓冲区,仅仅对它所在的处理器可见。这个特性会对内存操作的执行顺序产生重要的影响:处理器对内存的读/写操作的执行顺序,不一定与内存实际发生的读/写操作顺序一致!为了具体说明,请看下面示例: 初始状态:a = b = 0 处理器允许执行后得到结果:x = y = 0 假设处理器A和处理器B按程序的顺序并行执行内存访问,最终却可能得到x = y = 0的结果。具体的原因如下图所示: 这里处理器A和处理器B可以同时把共享变量写入自己的写缓冲区(A1,B1),然后从内存中读取另一个共享变量(A2,B2),最后才把自己写缓存区中保存的脏数据刷新到内存中(A3,B3)。当以这种时序执行时,程序就可以得到x = y = 0的结果。 …

[转载][博卡君]微信应用号「小程序」开发教程首发第二弹!

由于这两天小程序非常火爆,很多人把它当做另一个平台,是对于个人开发者的一个能力的释放。这里转载进行传播 原文链接 第三章:微信小程序项目结构以及配置 找到创建的 demo 文件夹,把项目导入到你的编辑器,这里使用的是 Sublime Text 编辑器。 这个时候需要根据自己的项目需求结构进行更改了,项目根目录下面是首页渲染的几个 tabBar 页面,以及 app 的一些配置文件,如名片盒项目的 tabBar 是 3 个切换菜单: 我们先找到 app.json 文件打开配置好这几个菜单,配置好 tabBar,这个直接把配置文件改成你自己设计的即可。 App.json 里面有几个配置项: Pages:这个是编写的 js 文件,后缀 .js 这里不需要使用,配置好正确路径即可正常应用到(应用不到在重启微信开发者工具会直接报 page 错误)。 Window:配置顶部的一些样式,文档介绍比较详细。 tabBar:底部的几项配置,见名知意。 networkTimeout:暂时没发现用处,建议看文档。 根据实际项目需求进行添加与更改。 iconPath 和 selectedIconPath:底部菜单按钮图片与得到切换点击高亮。 “text”:可以去掉,全部去掉会发现底部 tabar 高度会减少很多。 Json 文件配置好后,根据项目进行文件创建, Demo:存放的是假数据,这一期的开发工具支持 require,假数据使用的是 .js 文件形式,里面的数据结构 json 一致,把 data 暴露出去即可 然后取数据 require 进来即可,这一点使用很方便; Images:图片路径; …

贫富人家的孩子在思维方式上有差异吗?

难道没有跨域阶层的途径了么现在???? 每个阶层的视野,环境。影响了整个后代?? 说的很对,但是太过残酷, 没有人愿意轻易认”命”。 人一叩首 链接:http://www.zhihu.com/question/20785337/answer/26052573 来源:知乎 著作权归作者所有,转载请联系作者获得授权。 之前看过一篇文章,原文的题目叫做《寒门再难出贵子》,个人觉得写得特别好,不是因为我同意寒门难出贵子这个观点,而是这篇文章很完整并且恰如其分地分析了不同家庭背景的孩子的成长以及抉择,这是一篇值得我们这些青年看完的一篇文章,不管自己是属于哪种背景下的人,我们都可以从中学习到很多,有意识的克服自身的局限性。这篇文章很长,但很值得一看,挺切合这个题目,和知乎的朋友们分享一下。 原文如下: 现在越来越看清楚“性格决定命运”,性格这东西是熔透于骨髓的,性格的养成和学校教育没有多大关系,大多决定与家庭背景,和成长环境。从大学毕业出来的第一步,往往起到至关作用的是家庭背景,也就是从起跑线普通家庭的孩子就输了一大截。 在一个物欲横流的时代,当金钱决定一切,成为人的终极信仰的时候,这时候也是“门阀”、阶层相应出现的年代。 一群实习的大学生 结合我自己近半年来的观察, 我在商业银行人力资源部上班。去年招了很多学校的实习生,实习可不是正式录用了。以前自己年龄也相对年轻,没有太多关注以往的实习生,今年正好我负责这些孩子,在我们这里招了大概60名实习生,其实最后录用不会超过10人。这些实习,其实就是银行的噱头,可以找些一个月几百块钱对银行来说的免费劳动力,对学校,对外宣传,对社会某种义务交代吧。但然能进入银行实习的都是学校推荐的所谓的好学生。 银行这种单位,在我们的体质下,纯国家垄断机构,待遇相交于其他行业待遇还是比较高,在银行工作可以得到优惠的贷款利率,买房子贷款都相对容易。总之一句话是那种世人眼里比较羡慕的单位。 接下来讲讲这些孩子的人生的第一步究竟是怎么迈出,怎么的实际结果。有时候相处了这些比我小将近10岁的孩子,真的觉得一切的理想主义都是狗屁,只有现实无法再接触的现实。 大学毕业,更何况是大四,还是一些孩子。 去年的2月份我接待我们这个省最好大学的这批孩子,来到我们单位,从中可以看出这些孩子都是一个名牌211重点大学即将毕业的学生,可是他妈的组成又分了这么几种: 一类,农村家庭出来就是学习很努力的,在学校很优秀的,大概能有20多个;还有一类就是家庭县城的的孩子,有那么十几个;再就是所谓的大城市的孩子十几个,这就是当时看到他们的资料的印象。 印象很深的是去年三月份,他们第一次来到银行。因为第一天报到,我们准备了一间办公室,早上等着这些孩子来报到,上班后开始等着这些学生的到来,我的同事跟我说:我告诉你我知道哪些孩子来的早,哪些孩子进来会和我门打招呼,哪些孩子会和我们聊几句,哪些孩子会进来会给我们倒水,打赌的结果是中午请他必胜客…… 然后,他输出了一大堆简历说这些孩子,会来的相对早点,然后把这部分简历交给了我,真的当时的结果,最早来的十几个孩子都是他给我的那些简历里面的。 慢慢的陆陆续续的来了这些孩子,然后真的有的进来很紧张一句话不多说,有的笑嘻嘻的和我们聊几句;有的会很自然的说:以后你们是领导了,给你们倒点水;有的孩子会大大咧咧的。其结果是我同事预测的,错误率只有两个。当时我就惊奇了,中午请他吃饭,我说你怎么看出的,他说这不是他的绝招,是以前跟着副行长接待实习学生从副行长那里得到的一个启示。其实很简单,看简历资料的户籍所在地,和父母工作单位,能归纳出群体来,也相应的能归纳这同一所大学,几种孩子的性格特点,处事方法。因为有些东西是共同,物以类聚,人以群分。站在年长的角度上去分析就和容易得到一个初期的预测。 下面是同时分析的过程: 一、来的很早的孩子,大多是农村的孩子。因为他们重视这是一生中第一次离开学校去个正式单位实习,会很重视。因为是学校推荐,自然会打电话给家里,家里父母能给与的指导无非是好好珍惜。学校重视,第一天要早去,这一类的教导,自然来的最早的是这些孩子。但是都紧张,和我们几乎无交流。 二、进来和我们打招呼,并且还有倒水的那几个孩子无一例外,父母都是在党政机关工作,真的很准。 三、进来大大咧咧,还开几句玩笑的几个孩子,家里都是经商,可大可小,但是父母身上那种灵活态度的熏染,在身上能看出影子。 四、还有那么两三个,感觉挺冷傲,相对自信,对我们是属于那种不卑不亢的,这几个无一例外的属于大城市知识分子家庭的孩子。 就因为这个小插曲,我开始觉得很有意思,开始觉得应该去分析这群孩子。十年前的自己也是这个群体中的一员,我内心很清楚,实习的最后结果这群孩子只有几个可以留下,大多还是得自己找工作,那时候心里只是一个念头,保留下他们的联系方式,看看半年后,一年后,一年半后他们第一步迈出的样子,也许能追寻到他们十年后的样子,也就是现在的我,现在我身边的朋友、同学、同事。 就是这么个念头,让我注意去观察他们,去看着他们从孩子走向成人的第一步。没想到这一年多的观察,真的让我总结出了很多东西,也从里面看到了自己的困扰点。 选择哪个部门 这群大学生参观完单位后第一天报到的下午,需要在会议室这群孩子开个见面会,这种事是面子事,也是银行对外宣传点,自然会有位副行长级别的讲话,然后是人力资源部经理,然后就是具体的告诉这群孩子,去哪些部门实习。 就在领导们对着这帮孩子讲了一堆官话,套话的时候,一个小测验在我脑子里成型:让他们自己选择想去工作的部门,不能写一个,写三个,可以电话与家长交流,给他们20分钟时间考虑,他们直接在会议室不能相互交流,如果想得到指导,可以去走廊,给自己父母或亲人打电话咨询。 结果是大概十个孩子还明确的写出部门名称,选择的岗位相当不错,有一般随便写写,有的部门是自己臆想出来的,或者具体大概知道是什么工作性质,但是无法准确说出部门名称,就自己造了一个,还有几个写了就是写了 收钱,贷款 之类的几个字,这就是他们大学四年金融专业,经济等等专业。 然后,当然就是按照银行的实习流程,在给他们讲一下银行如何伟大,如何有前途,如何… 当我拿着他们的自荐部门的小纸条,有了这么一个发现:能够精确写出银行部门的那十几个孩子,大多家里是机关,和经商的;农村孩子有一个能精确写出,问了原因是自家有个亲戚在工商银行上班;知识分子家庭的孩子,大多都是什么行政,什么管理,什么内勤,是绝对不会和外联部门的业务有关系;经商的孩子都想实习客户经理;家庭父母在机关的大多都想做主管助理。真的很有意思,一点一点看出了他们的性格,一点一点看出了他们的选择。 开完会的时候,副行长告诉我,今年行里大概会招15个应届毕业生,各个方面的关系需要应付,这群孩子,只能选择优秀的留下两个或者三个,让我们负责细心甄别一下,到最后,作为单位录用的主要依据。这件事让我扶着,回来再看到这群孩子,我就有点心颤,60个都是学校的好学生,只有两到三个实习完就可以来这里上班了,人生的第一步,就可以以这里为开始,其他的五十七八个孩子又得迈向人山人海的招聘会,又得一次次的面试打印简历,突然心里觉得很压抑。 第二天,就是给他们安排部门了。哪个单位都一样,有的部门自然是舒服的要命,自然有的累的要死,其实哪个部门也想要跑腿的小孩,但是对我们来说的跑腿,对他们来说也是有好部门,不好的。如果被安排做大堂经理就要一直站着,挂个横幅,一天在大堂跑来跑去;安排的老总办公室的外边就是接电话,复印个材料;安排到监察部,对不起,跟着去安装提款机和指挥工人安装摄像头吧。因为实习不能安排做窗口从事窗口业务,大多就是内勤,外联,和打杂了。 俗话说,有人的地方就有江湖。别看小小实习,斗争就开始了。第二天一早我总共接了四五个电话,也有直接去我办公室的同事,级别高点的有部门老总,低点的有普通同事,开始给我打招呼:把哪个哪个孩子,直接弄他的一亩三分地,无一例外要和我吃饭,哈哈。。没办法,只好按照他们的要求吧相应的孩子,分到他们的麾下,人数,五个,还有五十个多个,只好采取叫到谁,一个部门一个部门来,一个部门满了,去下一个。这里面除了家里能联系到银行打过招呼的,其他就是随机,也许是运气吧。不过出于人道主义,我定了一个活的规则:一个月后轮岗! 时间就这么过着,我偶尔中午吃饭或者在办公楼碰到各个部门的同事,会问一下这些实习生的情况。当然了,什么情况都有,还不至于说捅篓子,但是有喜欢的,有夸的,当然也有抱怨的大学培养的是脑残吗,也有直接骂的,要我把蠢蛋弄到别的部门,给他们换个聪明伶俐的… 然后在这些同事的夸奖、褒扬、抱怨的、还有直接骂大街的当中,我发现了一个规律: 1、农村家庭的孩子普通不会交流。当处于一个部门的新人的时候,不会去交流,不会去拉近,更谈不上和什么拉近关系。虽然不是绝对,但是这个比例超过农村家庭的90%,但是这些孩子有个很大的优点,都很勤快,很少找借口,大体属于那种可以容忍的范围内。 2、受到夸奖的孩子家庭大多是经商家庭的孩子,比较活,在实习的时候,和老员工的互动能力比较强,有的家庭个别吐出不差钱的,甚至可以请老员工吃饭,有的还能在解决问题弄出个新点子。属于那种不会让人讨厌的类型,属于收到赞誉最多的一个群体。 3、再就是家里在党政机关做干部的孩子,最大的优点是有礼貌,会说话,不太会唐突,比较有眼力劲儿,个人气质比较好,但是有时候有耍小聪明的时候,因为年龄小,很容易被年长的发现,褒贬不一。 4、家庭知识分子的五六个孩子,这几个孩子无一例外的在工作一段时间后,都不太受实习部门的待见。原因有那么几个:一是没有眼力劲,二是相对自我感觉比较好,但是有时候会因为言语不懂得分清场合,和年龄差别,说出一些比较固执,和一些让实习部门尴尬的事情。 其中印象比较深的一个女孩子,父母是中学老师,自我感觉良好,对于安排的跑腿工作,说三道四,和谁说话也顶着来。弄得实习部门强烈不满,弄得很烦,最后没办法,只好让其检查消防器材,后来因为嫌辛苦,觉得不公平,找我谈话,最后我给的答案:如果不愿意接受,回学校吧。后来每天都迟到,自己就退出实习了,这是第一个自己退出的,也是唯一的一个。 很奇怪的性格,后来了解到这女孩子毕业后一直留在省会没有回老家,也没找到一份正式工作,好像在去蛋糕店工作了一阵,后来又去摆地摊,在后来就一直考研究生,再后来就没有她的消息了。 小胖和他爸的故事 和这个女孩截然相反的是个男孩,个子挺高,是个小胖子,喜欢笑,整天哈哈的。这家伙当初主动要求干大堂经理,因为姓齐,按照约定俗成就叫做齐小胖吧。当初我说大堂经理挺累,他还自动要求,说可以减肥、照顾女同学。然后说自己太胖,不适合干细致工作,呵呵,就是这个小家伙告诉了我什么叫做“人熟是个宝”,什么叫永远都笑绝对没错的。 这个孩子,家庭条件不错,父母开了一家不错的家居饰品店。当然这个小家伙学习也蛮好,从二级城市来到省会上大学,这孩子的性格很有意思,那他开玩笑,从来不会烦,见谁都笑呵呵的。这个孩子后来虽然没能留在银行工作,但是因为性格好,因为比较活,虽然没有进来,因为家庭条件可以提供一下支持。他在银行实习的六个月,混了个和谁都挺熟,最后因为在银行实习,自己开了家公司,主要是给银行安装提款机。因为这行业是个稀缺行业,一旦坐上了,就很难别人再代替。 一年的时间,小家伙买了房子,结了婚,也是时常给我打电话。因为当时他想做这个,和他爸爸交流了意见,因为和我比较熟,他爸爸专门跑来找我,请我吃饭,也就是这次吃饭他爸爸教给他,也是教给我一个很重要的人生道理:“人熟就是个宝”。 他吃饭的时候自然少不了一大堆奉承话,然后喝了点酒,就说到了自己没文化自己如何干成了一个家具城。当时我就觉得,这个小胖的爸爸应该有点思维含量,他告诉我说:小胖学习挺好,是个好孩子,估计想留在银行,家里没有门路,但是既然有条件在银行实习了,那么自己在省会也没啥能量,就让这个孩子希望能从银行的下属相关业务中找点什么做,从来没有听说过银行会欠债不还吧,当时这个思路真的让我大开眼界……当时就很有耐心的听了小胖爸爸的话,与其说小胖这孩子不错,还不如说小胖的爸爸真不错。 下面是小胖爸爸给小胖的规划: …

Hello world!

Welcome to WordPress. This is your first post. Edit or delete it, then start writing!

2013年1月份网站调整日志

网站在一月份的时候做了点调整 1、增加了feedsky的feed代码,google的统计代码。 2、对于文章最新文章显示也调整为:根据菜单选择不同而显示这一菜单下的最新文章。如网志这个菜单,显示就是归属于这个菜单的文章中最新的文章,即:该分类中的最新文章。 3、顶部的menubar的css以及其中rss也做了调整,中间文字部分的菜单不会在换行了应该。rss的控制css的js还未调整,本计划回家前调整的,怎奈没心情。 4、底部也做了调整,增加了“返回顶部”整个js,但是css调整不当,稍后根据感觉再整整。 5、安装代码高亮的插件,还是不错的,但是唯一一个缺点就是没有修改wp的编辑器,把代码做成按钮的形式,整个来年自己搞一下。 6、侧边栏的最近评论和标签顺序也做了调整,调换了两者的顺序,最新评论看着着实别扭。 另附:之前观察百度两个月里面就只收录一个首页而已,其他的都不在继续收录,后来只是简单的发了两个外链,今天观察已经收录4个了,快照也更新到了1月3号。uv到180,对于我来说已经是个不小的鼓励了,可惜的是一直没有到达pr1。 2013年2月2日0:20:27

HashMap中遍历的两种方式

根据jdk的api中的介绍,hashMap有以下特点: 1)允许使用 null 值和 null 键 2)非同步(同步需要封装: <span style=”font-family: Consolas, Monaco, monospace; font-size: 12px; line-height: 18px;”>Map m = Collections.synchronizedMap(new HashMap(…));)</span> 3)HashMap 的实例有两个参数影响其性能:初始容量 和加载因子。如果要保证遍历的效率,则不要将初始容量设置得太高(或将加载因子设置得太低)。默认的加载引子是0.75f。如果存储的entries不超过当前容量和加载因子的累积时,则不会发生 rehash 操作,这样效率查询和存储的效率都会较高(ps:。hashmap最大存储容量1<<30(即:2^30),初始容量是16(1<<4) 大部分情况下,都不会去更改初始容量和加载因子的,系统默认的0.75对时间和空间取了一种折中的方式。 在日常应用中常常会遍历hashmap,根据一个测试代码,发现下面两种遍历方式的效率截然不同。 一、 Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); Object key = entry.getKey(); Object val = entry.getValue(); } 效率高,以后建议采用使用此种方式 …

认真过好你的二十几岁

励志的文章看的非常非常的多,但是下面这篇文章是我感触最深的,可能是我现在处于作者的所描述的这个年龄段,而且自己也极度的需要肯定,渴望成功,希望得到指点。《认真过好你的二十几岁》源自外刊IT评论网 “别活得太认真,你逃不出你的命运。” – Van Wilder 这句流行的名言,对于如今的20几岁的青年,看起来就是让他们没有任何目标的自由生活,尽可能的为所欲为,不接受任何指引。作为一个工作狂、一个创业>者,从我自学校毕业,这句话就没有和我产生过共鸣,不仅如此,我甚至还十分慎重的过好每一分钟,因为我知道,20几岁,这是一生中一段非常独特的时间,是人生的其它时间代替不了的。 一个朋友最近推荐我一本书,《The Definining Decade: Why your twenties matter – and how to make the most of them now》。读完之后,我前所未有的认识到了我20几岁这段时间的重要性,它改变了我如何度过20几岁余下这最后几年的人生计划。 出自一位临床心理学家之手,这本书触及到了我们生活的各个关键点:工作,爱情和我们的身体。里面有很多的思想都是非常宝贵的,但最触动我的是下面这三个: 1) 你的20几岁为你之后余下的人生事业打下了成功的基础。 无论你做多长时间的酒吧招待或餐厅服务员,用多长时间在你家后院想你的“创业想法”,你都是在浪费生命,阻挡自己朝着未来更成功、更幸福的生活前进。 也许在星巴克当服务员的日子很快乐,但你的收入能养活你未来的孩子吗?更重要的,你真的打算今后10年仍然干这个吗?如果不是,那你目前的工作是否有助于你迈进你想要的工作的门槛吗?如果你不是Facebook的创始人,也许你应该考虑到一家创业公司开创自己的职业道路,而不是做一个永远都飞不起来的雏鸟。 人都是一步一步走出来的。从刚开始去做那些辛苦的低收入的,能力上绰绰有余的工作,慢慢得到越来越多的机会。我有硕士学位,仍然需要抽出时间来去实习,才能进入科技界的大门。实习工作让我在一家创业公司找到了全职工作,公司的创始人向我引荐了Hiten Shah,他成为了我的导师,现在,我给他的公司开发产品KISSmetrics。他是我见到的最成功的经营自己事业的人,他总是从小事做起。 经验:不要拖延开展自己的事业。越早进入一个行业或成为你希望的角色,越早你能获得你满意的职业生涯。 2) 据统计,女人应该在35岁之前生孩子。 根据作者所说,女人怀孕的能力在35岁左右的时候开始急剧下降。更糟糕的是,超过35岁,四分之一的女性会流产。这是一个令人震惊的数据,让我想象到了一副好不容易受孕却最终流产的场景。没有人想要这样的结果。 20几岁的时候成立家庭的想法和离我很遥远。我把事业放到了其它所有事情之前。但我知道,我最终是要组织一个家庭的。当知道了这些统计数据后,我们更加认清了我做的选择意味这什么、我现在所做的是为了什么。这正好说明了为什么这么多的创业者会在30左右开始建立家庭。 经验:如果组建一个家庭是你的人生目标,那你的时间会比你想象的要少。如果你是一个男的,想娶一个和你年纪相当的女人,时间的脚步走催促着你,同样也在催促着她。 3) 你的大脑中20多岁时成熟定型。 我一直以为人的大脑在孩子时就已经定型,从10几岁到三四十岁之间不会有多少变化,40四十以后开始萎缩。但事实证明,人的前大脑皮层会在20几岁时发生巨大的变化,30几岁时趋于稳定。维基百科上说: 额叶(frontal lobes)职能涉及到从当前的活动中认识将来的后果,影响你在好的活动和不好的活动之间做出的选择,忽视或制止不可接受的社会反应,在一些事情和事件间辨别它们的相似或不同。 作为一个有志向开创一个大型公司的人,我认识到现在就需要培养大量的用来领导这样一个公司的各种技能,因为再过几年你就很难或者根本不可能像现在这样学习知识。我听到很多的创业者在公司做到一定规模后就没有能力(或不想)管理这个公司,我现在正面临着提高自己和培养自己的巨大挑战。 经验: 不管你有什么样的人生或事业目标,你需要认识到,20多岁时获得的技能和人格特性将会决定着你余生的众多能力。 一本值得看的书,规划好你的今天,你的明天会活得更精彩。

JAVA字符编码之Java应用中的编码问题

第一篇:JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础 第二篇:JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换 第三篇:JAVA字符编码系列三:Java应用中的编码问题 1. 概述 本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等。 在下面的描述中,将以”中文”两个字为例,经查表可以知道其GB2312编码是”d6d0 cec4″,Unicode编码为”4e2d 6587″,UTF编码就是”e4b8ad e69687″。注意,这两个字没有iso8859-1编码,但可以用iso8859-1编码来”表示”。 2. 编码基本知识 最早的编码是iso8859-1,和ascii编码相似。但为了方便表示各种各样的语言,逐渐出现了很多标准编码,重要的有如下几个。 2.1. iso8859-1 属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。比如,字母’a’的编码为0x61=97。 很明显,iso8859-1编码表示的字符范围很窄,无法表示中文字符。但是,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用iso8859-1编码来表示。而且在很多协议上,默认使用该编码。比如,虽然”中文”两个字不存在iso8859-1编码,以gb2312编码为例,应该是”d6d0 cec4″两个字符,使用iso8859-1编码的时候则将它拆开为4个字节来表示:”d6 d0 ce c4″(事实上,在进行存储的时候,也是以字节为单位处理的)。而如果是UTF编码,则是6个字节”e4 b8 ad e6 96 87″。很明显,这种表示方法还需要以另一种编码为基础。 2.2. GB2312/GBK 这就是汉子的国标码,专门用来表示汉字,是双字节编码,而英文字母和iso8859-1一致(兼容iso8859-1编码)。其中gbk编码能够用来同时表示繁体字和简体字,而gb2312只能表示简体字,gbk是兼容gb2312编码的。 2.3. unicode 这是最统一的编码,可以用来表示所有语言的字符,而且是定长双字节(也有四字节的)编码,包括英文字母在内。所以可以说它是不兼容iso8859-1编码的,也不兼容任何编码。不过,相对于iso8859-1编码来说,uniocode编码只是在前面增加了一个0字节,比如字母’a’为”00 61″。 需要说明的是,定长编码便于计算机处理(注意GB2312/GBK不是定长编码),而unicode又可以用来表示所有字符,所以在很多软件内部是使用unicode编码来处理的,比如java。 2.4. UTF 考虑到unicode编码不兼容iso8859-1编码,而且容易占用更多的空间:因为对于英文字母,unicode也需要两个字节来表示。所以unicode不便于传输和存储。因此而产生了utf编码,utf编码兼容iso8859-1编码,同时也可以用来表示所有语言的字符,不过,utf编码是不定长编码,每一个字符的长度从1-6个字节不等。另外,utf编码自带简单的校验功能。一般来讲,英文字母都是用一个字节表示,而汉字使用三个字节。 注意,虽然说utf是为了使用更少的空间而使用的,但那只是相对于unicode编码来说,如果已经知道是汉字,则使用GB2312/GBK无疑是最节省的。不过另一方面,值得说明的是,虽然utf编码对汉字使用3个字节,但即使对于汉字网页,utf编码也会比unicode编码节省,因为网页中包含了很多的英文字符。 3. java对字符的处理 在java应用软件中,会有多处涉及到字符集编码,有些地方需要进行正确的设置,有些地方需要进行一定程度的处理。 3.1. getBytes(charset) 这是java字符串处理的一个标准函数,其作用是将字符串所表示的字符按照charset编码,并以字节方式表示。注意字符串在java内存中总是按unicode编码存储的。比如”中文”,正常情况下(即没有错误的时候)存储为”4e2d 6587″,如果charset为”gbk”,则被编码为”d6d0 cec4″,然后返回字节”d6 d0 ce c4″。如果charset为”utf8″则最后是”e4 b8 ad e6 96 87″。如果是”iso8859-1″,则由于无法编码,最后返回 “3f3f”(两个问号)。 …

JAVA字符编码系列之Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换

为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问题,特别是乱码问题,我觉得组成一个系列来描述和分析更好一些,包括三篇文章: 第一篇:JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础 第二篇:JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换 第三篇:JAVA字符编码系列三:Java应用中的编码问题 1、函数介绍 在Java中,字符串用统一的Unicode编码,每个字符占用两个字节,与编码有关的两个主要函数为: 1)将字符串用指定的编码集合解析成字节数组,完成Unicode-〉charsetName转换 public byte[] getBytes(String charsetName) throws UnsupportedEncodingException 2)将字节数组以指定的编码集合构造成字符串,完成charsetName-〉Unicode转换 public String(byte[] bytes, String charsetName) throws UnsupportedEncodingException 2、Unicode与各编码之间的直接转换 下面以对中文字符串"a中文"的编码转换为例,来了解各种编码之间的转换 1)Unicode和GBK 测试结果如下,每个汉字转换为两个字节,且是可逆的,即通过字节可以转换回字符串 String-GBK〉ByteArray:\u0061\u4E2D\u6587(a中文)-〉0x61 0xD6 0xD0 0xCE 0xC4 ByteArray-GBK〉String:0x61 0xD6 0xD0 0xCE 0xC4-〉\u0061\u4E2D\u6587(a中文) 2)Unicode和UTF-8 测试结果如下,每个汉字转换为三个字节,且是可逆的,即通过字节可以转换回字符串 String-UTF-8〉ByteArray:\u0061\u4E2D\u6587(a中文)-〉0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87 ByteArray-UTF-8〉String:0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87-〉\u0061\u4E2D\u6587(a中文) 3)Unicode和ISO-8859-1 测试结果如下,当存在汉字时转换失败,非可逆,即通过字节不能再转换回字符串 String-ISO-8859-1〉ByteArray:\u0061\u4E2D\u6587(a中文)-〉0x61 0x3F0x3F ByteArray-ISO-8859-1〉String:0x61 0x3F0x3F-〉\u0061\u003F\u003F(a??) …

JAVA字符编码系列之Unicode,GBK,GB2312,UTF-8概念基础

这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考。 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问题,特别是乱码问题,我觉得组成一个系列来描述和分析更好一些,包括三篇文章: 第一篇:JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础 第二篇:JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换 第三篇:JAVA字符编码系列三:Java应用中的编码问题 Unicode: unicode.org制定的编码机制, 要将全世界常用文字都函括进去. 在1.0中是16位编码, 由U+0000到U+FFFF. 每个2byte码对应一个字符; 在2.0开始抛弃了16位限制, 原来的16位作为基本位平面, 另外增加了16个位平面, 相当于20位编码, 编码范围0到0x10FFFF. UCS: ISO制定的ISO10646标准所定义的 Universal Character Set, 采用4byte编码. Unicode与UCS的关系: ISO与unicode.org是两个不同的组织, 因此最初制定了不同的标准; 但自从unicode2.0开始, unicode采用了与ISO 10646-1相同的字库和字码, ISO也承诺ISO10646将不会给超出0x10FFFF的UCS-4编码赋值, 使得两者保持一致. UCS的编码方式: UCS-2, 与unicode的2byte编码基本一样. UCS-4, 4byte编码, 目前是在UCS-2前加上2个全零的byte. UTF: Unicode/UCS Transformation Format UTF-8, 8bit编码, ASCII不作变换, 其他字符做变长编码, 每个字符1-3 byte. 通常作为外码. 有以下优点: 与CPU字节顺序无关, 可以在不同平台之间交流 容错能力高, 任何一个字节损坏后, 最多只会导致一个编码码位损失, 不会链锁错误(如GB码错一个字节就会整行乱码) UTF-16, …