|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
因为能用到多少功能就用多少,不能用就不用!总的来说:要简单要性能好,可以不用框架。你说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这些最基本的,嘿嘿,就算你是高手的话,在大行的企业级应用的话还是需要框架的,一个好的框架确实能构解决许多问题。 |
|