若天明 发表于 2015-1-18 11:01:04

来看深切了解Java内存模子(六) final

因为能用到多少功能就用多少,不能用就不用!总的来说:要简单要性能好,可以不用框架。你说java复杂,就是因为你把java(j2ee)与这些框架混在了一起。
与后面先容的锁和volatile比拟较,对final域的读和写更像是一般的变量会见。关于final域,编译器和处置器要恪守两个重排序划定规矩:
在机关函数内对一个final域的写进,与随后把这个被机关对象的援用赋值给一个援用变量,这两个操作之间不克不及重排序。
初度读一个包括final域的对象的援用,与随后初度读这个final域,这两个操纵之间不克不及重排序。
上面,我们经由过程一些示例性的代码来分离申明这两个划定规矩:

publicclassFinalExample{
inti;//一般变量
finalintj;//final变量
staticFinalExampleobj;

publicvoidFinalExample(){//机关函数
i=1;//写一般域
j=2;//写final域
}

publicstaticvoidwriter(){//写线程A实行
obj=newFinalExample();
}

publicstaticvoidreader(){//读线程B实行
FinalExampleobject=obj;//读对象援用
inta=object.i;//读一般域
intb=object.j;//读final域
}
}
这里假定一个线程A实行writer()办法,随后另外一个线程B实行reader()办法。上面我们经由过程这两个线程的交互来讲明这两个划定规矩。
写final域的重排序划定规矩
写final域的重排序划定规矩禁止把final域的写重排序到机关函数以外。这个划定规矩的完成包括上面2个方面:
JMM克制编译器把final域的写重排序到机关函数以外。
编译器会在final域的写以后,机关函数return之前,拔出一个StoreStore屏蔽。这个屏蔽克制处置器把final域的写重排序到机关函数以外。
如今让我们剖析writer()办法。writer()办法只包括一行代码:finalExample=newFinalExample()。这行代码包括两个步骤:
机关一个FinalExample范例的对象;
把这个对象的援用赋值给援用变量obj。
假定线程B读对象援用与读对象的成员域之间没有重排序(即刻会申明为何必要这个假定),下图是一种大概的实行时序:

在上图中,写一般域的操纵被编译重视排序到了机关函数以外,读线程B毛病的读取了一般变量i初始化之前的值。而写final域的操纵,被写final域的重排序划定规矩“限制”在了机关函数以内,读线程B准确的读取了final变量初始化以后的值。
写final域的重排序划定规矩能够确保:在对象援用为恣意线程可见之前,对象的final域已被准确初始化过了,而一般域不具有这个保证。以上图为例,在读线程B“看到”对象援用obj时,极可能obj对象还没有机关完成(对一般域i的写操纵被重排序到机关函数外,此时初始值2还没有写进一般域i)。
<p>
首先第一点:jsp,servlet,javabean这些最基本的,嘿嘿,就算你是高手的话,在大行的企业级应用的话还是需要框架的,一个好的框架确实能构解决许多问题。

若相依 发表于 2015-1-20 12:45:19

设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧

只想知道 发表于 2015-1-23 16:13:50

是一种使网页(Web Page)产生生动活泼画面的语言

仓酷云 发表于 2015-1-31 18:15:16

还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。

变相怪杰 发表于 2015-2-2 16:18:10

设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧

分手快乐 发表于 2015-2-8 00:55:47

是一种突破用户端机器环境和CPU

小女巫 发表于 2015-2-23 20:16:17

是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能

再现理想 发表于 2015-3-7 10:08:37

在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。

不帅 发表于 2015-3-14 20:35:15

J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。

兰色精灵 发表于 2015-3-21 14:04:19

一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
页: [1]
查看完整版本: 来看深切了解Java内存模子(六) final