仓酷云

标题: 来看深切了解Java内存模子(六) final [打印本页]

作者: 若天明    时间: 2015-1-18 11:01
标题: 来看深切了解Java内存模子(六) final
因为能用到多少功能就用多少,不能用就不用!总的来说:要简单要性能好,可以不用框架。你说java复杂,就是因为你把java(j2ee)与这些框架混在了一起。
与后面先容的锁和volatile比拟较,对final域的读和写更像是一般的变量会见。关于final域,编译器和处置器要恪守两个重排序划定规矩:
在机关函数内对一个final域的写进,与随后把这个被机关对象的援用赋值给一个援用变量,这两个操作之间不克不及重排序。
初度读一个包括final域的对象的援用,与随后初度读这个final域,这两个操纵之间不克不及重排序。
上面,我们经由过程一些示例性的代码来分离申明这两个划定规矩:
  1. publicclassFinalExample{
  2. inti;//一般变量
  3. finalintj;//final变量
  4. staticFinalExampleobj;
  5. publicvoidFinalExample(){//机关函数
  6. i=1;//写一般域
  7. j=2;//写final域
  8. }
  9. publicstaticvoidwriter(){//写线程A实行
  10. obj=newFinalExample();
  11. }
  12. publicstaticvoidreader(){//读线程B实行
  13. FinalExampleobject=obj;//读对象援用
  14. inta=object.i;//读一般域
  15. intb=object.j;//读final域
  16. }
  17. }
复制代码
这里假定一个线程A实行writer()办法,随后另外一个线程B实行reader()办法。上面我们经由过程这两个线程的交互来讲明这两个划定规矩。
写final域的重排序划定规矩
写final域的重排序划定规矩禁止把final域的写重排序到机关函数以外。这个划定规矩的完成包括上面2个方面:
JMM克制编译器把final域的写重排序到机关函数以外。
编译器会在final域的写以后,机关函数return之前,拔出一个StoreStore屏蔽。这个屏蔽克制处置器把final域的写重排序到机关函数以外。
如今让我们剖析writer()办法。writer()办法只包括一行代码:finalExample=newFinalExample()。这行代码包括两个步骤:
机关一个FinalExample范例的对象;
把这个对象的援用赋值给援用变量obj。
假定线程B读对象援用与读对象的成员域之间没有重排序(即刻会申明为何必要这个假定),下图是一种大概的实行时序:
来看深切了解Java内存模子(六) final
登录/注册后可看大图

在上图中,写一般域的操纵被编译重视排序到了机关函数以外,读线程B毛病的读取了一般变量i初始化之前的值。而写final域的操纵,被写final域的重排序划定规矩“限制”在了机关函数以内,读线程B准确的读取了final变量初始化以后的值。
写final域的重排序划定规矩能够确保:在对象援用为恣意线程可见之前,对象的final域已被准确初始化过了,而一般域不具有这个保证。以上图为例,在读线程B“看到”对象援用obj时,极可能obj对象还没有机关完成(对一般域i的写操纵被重排序到机关函数外,此时初始值2还没有写进一般域i)。
<p>
首先第一点:jsp,servlet,javabean这些最基本的,嘿嘿,就算你是高手的话,在大行的企业级应用的话还是需要框架的,一个好的框架确实能构解决许多问题。
作者: 若相依    时间: 2015-1-20 12:45
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
作者: 只想知道    时间: 2015-1-23 16:13
是一种使网页(Web Page)产生生动活泼画面的语言
作者: 仓酷云    时间: 2015-1-31 18:15
还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。
作者: 变相怪杰    时间: 2015-2-2 16:18
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
作者: 分手快乐    时间: 2015-2-8 00:55
是一种突破用户端机器环境和CPU
作者: 小女巫    时间: 2015-2-23 20:16
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
作者: 再现理想    时间: 2015-3-7 10:08
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
作者: 不帅    时间: 2015-3-14 20:35
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
作者: 兰色精灵    时间: 2015-3-21 14:04
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2