边走边看

来源: BlogBus 原始链接: http://www.blogbus.com:80/blogbus/blog/index.php?blogid=10547 存档链接: https://web.archive.org/web/20041024191516id_/http://www.blogbus.com:80/blogbus/blog/index.php?blogid=10547


边走边看 这个blog到底要定位成一个什么样的东西呢,我也不知道,只能是边走边看了。 首页 杂记 (20) 读书 (21) 技术 (18) 游走 (4) 分页: [1] [2] [3] [4] [5] [6] [7] [8] [9] 2004-10-25 00:43 jvm规范-线程,锁和优化 第八章线程和锁 这章描述的是非常底层的jvm运作的时候的概念上的部分模型,与前部分的编译不属于一个层次。 本章提到的变量概念是指类实例,类变量,和类数组。而参数和局部变量并不强行要求到这个变量概念之中。 8。1术语和框架 jvm中有主寄存器,当一个线程被启动时,会创建自己的工作寄存器,当线程运行,会对主寄存器中的数据进行拷贝,存入自己的工作寄存器中。 主寄存器包含每个变量的主拷贝。 主寄存器也包含锁,每个对象有个与其相关的锁。线程可以竞争获得一个锁。 相关术语: use,assign,load,store,lock,unlock为线程可以执行的动作。 read,write,lock,unlock为主存储器子系统可以执行的动作。 use,assign是线程执行引擎与工作存储之间的紧密耦合交互作用。 lock,unlock是线程执行引擎与主存储之间的紧密耦合交互作用。 主存储与工作存储之间却是松散耦合的。 分别对应的动作就是:load,store和lock,unlock 注意有三个实体在协同工作:主存储器,工作存储器,线程运行引擎 8。2执行顺序和一致性。 1。同线程执行动作排序 2、主存储执行的、对同一变量的动作排序 3、主存储执行的、对同一锁的动作排序 4、不允许一个动作跟在其自身后面。 第4点特殊说明:虽然看起来无关紧要,但必须显式说明,以保证完整性。因为这种危险确实存在。 线程的动作和主存储的动作间的约束: 1、每个lock和unlock动作必须由一些线程和主存储共同执行。 2、每个load动作,唯一的与一个write动作配对,这样write动作跟在store动作后。 8。3有关变量的规则 线程T对变量V的操作约束: 1、T执行过程中只有需要相应使用V时才调用use,或者assign动作。 2、T执行的assign动作必须插入到T对V的load或者store和后继的由T执行的对V的store之间。(保证主存储内值的正确,同时保证assign动作之前工作存储内存在V) 3、在T对V执行use和store之前,必须执行assign或load操作(保证工作存储器中有V,并且已经初始化) 4、在V创建后,每个T在use或store之前,必须执行assign或load操作。 对于第4点:volatile(易变)变量有更严格的约束 由主存储器执行的read和right操作的约束: 1、T对V的load,必须先有对应的read 2、T对V的store,必须后继对应的write 3、动作A,B是T对V的load或store动作,P,Q为对应的read或write,如果A优先于B,则P必须有些于Q 8.4Double和long变量的非原子处理 由于32位机器的效率问题,有些jvm实现对double和long这种64位值操作是非原子的,导致一些同步问题(如程序员总是需要显式指定同步于对double和long上的操作),其实这只是一种软件设计对硬件的妥协而已。 8。5有关锁的规则 线程为T,锁为L,T执行的关于L的操作约束如下: 1、T对L的lock操作,必须对于每个不是T的线程S,S对L的unlock操作数等于之前的S对L的lock操作数 2、T对L的unlock操作,必须要求先前T对L的unlock操作数,小于先前T对L的lock操作数(不解不拥有的锁) 8。6有关锁和变量交互作用的规则 线程T,锁L,变量V,T执行的关于L和V的操作约束如下: 1、在t对V的assign和随后的unlock之间,必须插入store操作。对应于该store的write操作必须先于unlock操作(保证L对于V的有效性)。 2、在lock和随后执行的use或store之间,必须插入assign或load操作。 8。7有关volatile(易变)变量的规则 线程T,易变变量V和W 1、load和use操作必须成对出现,紧挨在一起,并且load操作在前 2、assign和store操作必须成对出现,紧挨在一起,并且assign操作在前 3、A、B为T对V的use或assign,F、G为对应的load或store,P、Q为对应的read或write,如果A先于B,则P必须优先于Q。 8。8先见存储操作 如果变量没有声明为violate,则store操作可以提前于assign,store操作将将要赋给V的值替代V实际的值进行store操作,只要满足: 1、如果发生store,必然发生assign。 2、重定位的store和assign间未插入锁定操作。 3、重定位的store和assign间未插入对V的load 4、重定位的store和assign间未插入其他对V的store 5、store操作将assign操作要放到线程T的Z作为存储器中的值传到主存储器。 8。9讨论 8。10可能的交换 一个关于同步和锁的小例子。 8。11范例:无序写 另一个例子 8。12线程 线程由Thread和ThreadGroup类创建并管理。创建Thread对象就创建一个线程,而且是创建线程的唯一方式。当线程被创建时,它还不是活跃的,当其start方法被调用时,开始运行。 8。13锁和同步 每个对象都有与其关联的锁。 当synchronized方法被调用时,它自动执行锁定操作;如果该方法是实例方法,它锁定同实例相关联的锁,如果方法是static的,它锁定同Class对象相关联的锁 8。13等待集和通知 每个对象除了相关的锁外,还有相关的等待集,即一组线程,首次创建的对象,等待集为空。 讲述了wait,notify,notifyall几个方法,wait方法往等待集中增加内容,而notify或notifyall方法从等待集中删除内容。 但不能完全读懂内容,可细研究。 第九章优化 本章描述jvm中Sun版本中实现的优化。 在此优化中,编译的jvm代码在运行期修改,利用运行期获得的信息,做比源指令更少的工作,以获得更好的性能。 9。1通过重写动态链接 对重写的指令,指令的每个实例在其第一次执行时被替换为_quick伪指令,该指令实例随后执行的总是_quick变体。 其余是对_quick伪指令的描述,可用于查阅,因为这是Sun的jdk在运行的时候的真正指令状态。 第十章 操作码的操作码助记符 这章主要是个附录的功能,可供查阅。 ××××××××××××××××××××××××××××××××××× 在延期了将近一个月了之后,终于算是看过了一遍这本书,虽然有很多没有看的非常明白的地方,但是比我预期的效果要好了许多了,进一步的细致研究可以安排在后面。 flyffa @ 00:43 | 阅读全文 | 评论(0) | 引用Trackback(0) | 编辑 2004-10-24 15:43 jvm规范-编外i=i++ i=0;i=i++为什么等于0这个问题困扰了我好长的一段时间,结果前段时间还试图从虚拟机那个层面进行解释,但无论是线程还是方法调用都不能解释其现象,发现方向性错误,这只是一个语言的特性而已。在java lang spec中提到: 1、java运算符的优先级++符是大于=的。 2、The result of the postfix increment expression is not a variable, but a value.后++符表达式的结果是个值而不是一个变量。 也就是说后++符先将自己的值存储起来,然后对变量进行++; 再进行赋值操作,也就是将先存储起来的值赋给变量i,这样的操作就导致了i值被置为0了 对于C和C++来说不一样,在讲到m=i++操作时,C语言是先将i的值赋给了m,然后将i值++,这样i=i++的结果自然就是1了,c的实现中是不存在那个中间的值的存储的。 由于java和c不同的语言特性,导致了i=i++的不同之处,前面的笔记中已经提到,由于java lang spec中的一些细微规定,导致其运行结果的不同,我们可以用个例子来看i=i++在jvm中实际的运行过程。 源程序test.java: public class test { public test() { } public static void main(String[] args) { int i=0; i=i++; } } 我们用javap来看其实际的虚拟机指令集: C:\JBuilderX\jdk1.4\bin>javap -c -classpath "d:/" test Compiled from "test.java" public class test extends java.lang.Object{ public test(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."":()V 4: nop 5: return public static void main(java.lang.String[]); Code: 0: iconst_0 //常数0入栈 1: istore_1 //i赋值,常数值出栈 //至此完成i=0; 2: iload_1 //装载变量i,0入栈 //第2步是特殊的一步,这步将i值先行保存,以备赋值使用 3: iinc 1, 1 //变量值增加,栈内值不变 //至此完成i++ 6: istore_1 //i赋值,0出栈。 //至此完成i=i++ 7: nop //donothing 8: return } 对比而言,对于i++而言,i=i++指令多了两步,2和6 其实这两步是赋值符号引起的,有意思的是第二步出现的时机,是在iinc之前,这就是因为java lang spec中规定的。 flyffa @ 15:43 | 阅读全文 | 评论(0) | 引用Trackback(0) | 编辑 2004-10-22 13:25 jvm规范-class文件格式 第四章:class文件格式 java.io.DataInput和java.io.Output输入输出的都是以高端字节序输出字节。 与C结构的域不同,class文件中连续的项顺序存储,不进行填充或者对齐。 4.1classFile 一个class文件包含一个单独的classFile结构,包含: 一个四字节的幻数表明class类型。具有值0XCAFEBABE; access_flag用于表明是类还是接口,是abstract,final还是其他 另外分别有表存储:常量、属性、方法、域。 目前属性只有sourceFile属性。 4。2完全限定类名称的内部形式 出现在classFile文件结构中的类都以完全限定类名称的方式出现,并且不是类似于java.lang.xxx,而是变为java/lang/xxx 4.3描述符 域类型有:根类型,对象类型,数组类型 根类型有:B,C,D,F,I,J,S,Z 对象类型:L 数组类型:[ 多维数组double[][][] d的表示方式:[[[D 方法返回描述符 V表示void object mymethod(int i,double j,Thread t)的方法描述符为: (IDLjava/lang/Thread;)Ljava/lang/Object; java的方法不管是static还是实例方法描述符都是如此,区别在于jvm运行时给实例方法隐式的传递当前对象的指针this 4.4常数池 常数池由一组类似于cp_info的结构构成 cp_info{ u1 tag; u1 info[]; } 4.5域 每个域由一个变长的field_info构成 field_info{ u2 access_flags; u2 name_index; u2 descriptor_index; u2 attribute_count; attribute_info attributes[attributes_count]; } 4.6方法 每个方法由变长结构method_info构成 method_info{ u2 access_flags; u2 name_index; u2 descriptor_index; u2 attribute_count; attribute_info attributes[attributes_count]; } 4.7属性 属性用于field_info,method_info,class_file结构之中,结构一般如下: attribute_info{ u2 attribute_name_index; u4 attribute_length; u1 info[attribute_length]; } 某些属性被预定义作为class文件规范的一部分,这些属性是:sourceFile,ConstantValue,code,exception,lineNumberTable和localVariableTable属性。 4。8对java虚拟机代码的约束 4。9class文件的检验 4。10java虚拟机和class文件格式的限制 flyffa @ 13:25 | 阅读全文 | 评论(0) | 引用Trackback(0) | 编辑 2004-10-18 16:09 读《Microsoft .NET编程语言C#教程》 看了一遍C#的入门级教程,了解了一下C#语言,基本上和java非常的相似,但是还是引入了一些东西。 1、属性:明确的将属性列了出来,而不是javabean中的set,get方式,虽然也是get,set方式的封装,却显得更加的清晰和灵活。 2、事件:将事件特性集成到了语言特性中,提供特殊的支持,并且有着类似于jscript中动态对事件处理进行赋值的特性。 3、访问控制:对于public ,protected,private几种控制关键字进行了扩展,增加了internal关键字,对程序集范围进行控制(程序集指的是一个dll或者一个exe)。 4、继承控制:增加了new关键字,对于未明确指明重载的方法,提供编译警告,通过new关键字消除。将java中的final类改为sealed类。 5、流程控制:增加for-each语句 6、数据类型:通过所谓的装箱和拆箱技术,完成简单数据类型与对象之间的转接。 其余还有一些,但基本和java相似,对于类和文件的命名以及存储也少了一些限制。 flyffa @ 16:09 | 阅读全文 | 评论(0) | 引用Trackback(0) | 编辑 2004-10-14 11:15 关于认知 闲来想想自己读过的一些比较有思想深度的文章和书籍,产生了一些关于理论体系的想法。 古代有许多伟大的哲学家、思想家,其思想虽然有许多闪光之处,同样也有许多的谬误之处,但其关键是能够自己说服自己,形成一套体系,从而形成一套理论,一套能够自圆其说的理论,无论是德莫克立特、苏各拉底、阿基米德还是弗洛伊德、康德,都形成了一套能够在当时能自圆其说的理论,人的认知领域由于技术和主观干预的原因,有很多因素是未知的,这些人的厉害之处,就是通过猜想、假定将这些未知因素互相不矛盾的解释清楚了。认知永远就像一些零散的、短的、无序的线条,而用一些虚线将他们连接起来,就能成为一个整体的圆了,作为理论的创始者本身,他们非常清楚的知道,什么是推理出来的,什么是假想出来的,什么是观察得来的,无论是试图解释还是试图解决问题,这种人才是真正的拥有自己观点的人。 还有一种伟大的思想家,应该说以文学家为主的群体,他们并不能形成一种理论,甚至说,他们比一般人更加的矛盾和痛苦,卡夫卡的城堡,狄更斯的双城记,陀斯陀耶夫斯基的罪与罚,昆德拉的生命不能承受之轻,都在昭示着一种无奈,生命与自然、与时间、与社会、与四周那些莫名的存在之间的矛盾,通过他们的叙述,提出一个又一个的问题,那些他们认为不可调和的矛盾。 而大多数的人,在认知上的痛苦只有一种,就是混沌,不知道生命中的矛盾在哪里,更不用说去试图解释或者解决这种矛盾了,所以就算信奉某种理念,也是混沌的信奉,也会去曲解,也无法去微调观点去适应,只能等待整个理念的坍塌,然后人的精神的坍塌,当然,一个思想的更替往往需要特别特别长的时间,然后是个思想的风暴,然后再重新构建,大多数人能够在一种思维下安然度过,当然变化是无常的,而痛苦也就是必然的,只是有着隐痛和阵痛的区别了。 我是个怀疑主义者,我怀疑一切的理论,因为只要思考,就会发现这里面有太多的假设和人为的设定,我们根据我们自己的理解,根据一千次,一万次的试验,我们就决定了自然界每天都要进行亿万次的事务的规律,我们的科学就是架设在这样的东西之上的,怎能让人信服,就像地心说,日心说曾经被作为公理一样,现在的公理同样有着被推翻的可能,基础不在,大厦何存哪。 在电脑的虚拟社会里,程序就是规律,程序的设定就是规律,没有设计,从程序运行的现象反推程序是非常困难,甚至是不可能的事情。对于一个象人类社会这样的复杂系统,反推基本就是不可能的,否则人人都是上帝,都是盘古,都是女娲,都是创世者了。 然而必须承认,在这样的积累中,我们仍然是非常需要假设、需要所谓的科学、哲学、思想的,只是要知道这些东西不是真理,只是工具,甚至是偏离真理很远的,我们要随时保持着一颗可调整的心。 而认知就需要找出那些根本的矛盾,再想办法找到解决或者解释的办法。 flyffa @ 11:15 | 阅读全文 | 评论(0) | 引用Trackback(0) | 编辑 2004-10-09 00:04 福建福州 由于工作的关系,到福建已经两个多月了,7月底离开北京的。 福州是个不大的城市,应该来说是个没有特色的城市了,人没有南方的那种精明灵气,也缺少北方人的豪气,福州的城市也是如此,靠在闽江的边上,却怎么看怎么像一个纯粹的山城,由于不是太富裕的关系吧,福州显得还是很落后,无论从街道、环境还是周围的人群,福州总是给我一种小气的味道,为了省小钱结果花了钱和没花一样。 从省政府门前示威的工人可以看出,改革的阵痛在这里依然在继续,我几乎不能相信,在福建还有一个据说很美丽的厦门。 福州的小吃也和其他的东西一样,略微的带点甜腻,混在海鲜的味道里,确实让我有些受不了,不过总算比上海好了许多。 福州的苍山区我坐公交去了一次,感觉不错,依山而建的小房子,安静的小路,倒是显得很恬静。 这样的城市,随处可以看到的就是规划的问题,我上下班要经过的一个立交桥,从我来到现在,从修建到建好,交通没有看到一丁点的改善。在人流最大的地方树了两个大墩子,只能是缩短了路面的宽度而已。 当然,如果福州能够定下心来,好好的按照一个中小城市的规划来做,有着福州人这种细致的优秀品质和得天独厚的自然环境,我想一定可以制造出一个花园一样的城市的,而无需强求经济中心、政治中心、大都市这种虚名。 flyffa @ 00:04 | 阅读全文 | 评论(2) | 引用Trackback(0) | 编辑 2004-10-05 00:02 计划延期了 原定的读书计划里,10月1号之前应该是读完jvm规范的,看来是延期了,有些郁闷。需要重新调整计划了。 从28号回家到明天离开,一转眼就是8天过去了,真是快啊。 人还是很有惰性的,到了家里,明显就懒了许多,不像自己一个人在外奔波的时候那么有自律性了,不过还是舒服啊。 夜深了,睡了。 flyffa @ 00:02 | 阅读全文 | 评论(0) | 引用Trackback(0) | 编辑 日历 2004 年 10 月 Sun Mon Tue Wen Thu Fri Sat 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 最近更新 jvm规范-线程,锁和优化 jvm规范-jvm虚拟指令集及编译 jvm规范-编外i=i++ jvm规范-class文件格式 读《Microsoft .NET编程语言C#教程》 关于认知 福建福州 计划延期了 想要做的事情 江湖。红尘 最新评论 flyffa : 呵呵,只是写了写. blueitaly : 那建议你去厦门看. class : 你能知道未来? 先. ryana : 狂喜欢这本书,就. class : 数据库驱动程序负. Starry11 : 我更喜欢《白痴》. 西北古浪 : 没错啊,他的很多. 西北古浪 : 没错啊,他的很多. 西北古浪 : 没错啊,他的很多. 存档 我的链接