對(duì)synchronized(this)的一些理解
?
一、當(dāng)兩個(gè)并發(fā)線程訪問(wèn)同一個(gè)對(duì)象object中的這個(gè)synchronized(this)同步代碼塊時(shí),一個(gè)時(shí)間內(nèi)只能有一個(gè)線程得到執(zhí)行。另一個(gè)線程必須等待當(dāng)前線程執(zhí)行完這個(gè)代碼塊以后才能執(zhí)行該代碼塊。
?
二、然而,當(dāng)一個(gè)線程訪問(wèn)object的一個(gè)synchronized(this)同步代碼塊時(shí),另一個(gè)線程仍然可以訪問(wèn)該object中的非synchronized(this)同步代碼塊。
?
三、尤其關(guān)鍵的是,當(dāng)一個(gè)線程訪問(wèn)object的一個(gè)synchronized(this)同步代碼塊時(shí),其他線程對(duì)object中所有其它synchronized(this)同步代碼塊的訪問(wèn)將被阻塞。
?
四、第三個(gè)例子同樣適用其它同步代碼塊。也就是說(shuō),當(dāng)一個(gè)線程訪問(wèn)object的一個(gè)synchronized(this)同步代碼塊時(shí),它就獲得了這個(gè)object的對(duì)象鎖。結(jié)果,其它線程對(duì)該object對(duì)象所有同步代碼部分的訪問(wèn)都被暫時(shí)阻塞。
?
五、以上規(guī)則對(duì)其它對(duì)象鎖同樣適用.
?
舉例說(shuō)明:
?
一、當(dāng)兩個(gè)并發(fā)線程訪問(wèn)同一個(gè)對(duì)象object中的這個(gè)synchronized(this)同步代碼塊時(shí),一個(gè)時(shí)間內(nèi)只能有一個(gè)線程得到執(zhí)行。另一個(gè)線程必須等待當(dāng)前線程執(zhí)行完這個(gè)代碼塊以后才能執(zhí)行該代碼塊。
?
package ths;
public class Thread1 implements Runnable {
public void run() {
synchronized(this) {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + " synchronized loop " + i);
}
}
}
public static void main(String[] args) {
Thread1 t1 = new Thread1();
Thread ta = new Thread(t1, "A");
Thread tb = new Thread(t1, "B");
ta.start();
tb.start();
}
}
?
結(jié)果:
?
A synchronized loop 0
A synchronized loop 1
A synchronized loop 2
A synchronized loop 3
A synchronized loop 4
B synchronized loop 0
B synchronized loop 1
B synchronized loop 2
B synchronized loop 3
B synchronized loop 4
?
二、然而,當(dāng)一個(gè)線程訪問(wèn)object的一個(gè)synchronized(this)同步代碼塊時(shí),另一個(gè)線程仍然可以訪問(wèn)該object中的非synchronized(this)同步代碼塊。
?
package ths;
public class Thread2 {
public void m4t1() {
synchronized(this) {
int i = 5;
while( i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : " + i);
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
}
}
}
public void m4t2() {
int i = 5;
while( i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : " + i);
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
}
}
public static void main(String[] args) {
final Thread2 myt2 = new Thread2();
Thread t1 = new Thread(
new Runnable() {
public void run() {
myt2.m4t1();
}
}, "t1"
);
Thread t2 = new Thread(
new Runnable() {
public void run() {
myt2.m4t2();
}
}, "t2"
);
t1.start();
t2.start();
}
}
?
結(jié)果:
?
t1 : 4
t2 : 4
t1 : 3
t2 : 3
t1 : 2
t2 : 2
t1 : 1
t2 : 1
t1 : 0
t2 : 0
?
三、尤其關(guān)鍵的是,當(dāng)一個(gè)線程訪問(wèn)object的一個(gè)synchronized(this)同步代碼塊時(shí),其他線程對(duì)object中所有其它synchronized(this)同步代碼塊的訪問(wèn)將被阻塞。
?
//修改Thread2.m4t2()方法:
public void m4t2() {
synchronized(this) {
int i = 5;
while( i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : " + i);
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
}
}
}
?
結(jié)果:
?
t1 : 4
t1 : 3
t1 : 2
t1 : 1
t1 : 0
t2 : 4
t2 : 3
t2 : 2
t2 : 1
t2 : 0
?
四、第三個(gè)例子同樣適用其它同步代碼塊。也就是說(shuō),當(dāng)一個(gè)線程訪問(wèn)object的一個(gè)synchronized(this)同步代碼塊時(shí),它就獲得了這個(gè)object的對(duì)象鎖。結(jié)果,其它線程對(duì)該object對(duì)象所有同步代碼部分的訪問(wèn)都被暫時(shí)阻塞。
?
//修改Thread2.m4t2()方法如下:
public synchronized void m4t2() {
int i = 5;
while( i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : " + i);
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
}
}
?
結(jié)果:
?
t1 : 4
t1 : 3
t1 : 2
t1 : 1
t1 : 0
t2 : 4
t2 : 3
t2 : 2
t2 : 1
t2 : 0
?
五、以上規(guī)則對(duì)其它對(duì)象鎖同樣適用:
?
package ths;
public class Thread3 {
class Inner {
private void m4t1() {
int i = 5;
while(i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : Inner.m4t1()=" + i);
try {
Thread.sleep(500);
} catch(InterruptedException ie) {
}
}
}
private void m4t2() {
int i = 5;
while(i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : Inner.m4t2()=" + i);
try {
Thread.sleep(500);
} catch(InterruptedException ie) {
}
}
}
}
private void m4t1(Inner inner) {
synchronized(inner) { //使用對(duì)象鎖
inner.m4t1();
}
}
private void m4t2(Inner inner) {
inner.m4t2();
}
public static void main(String[] args) {
final Thread3 myt3 = new Thread3();
final Inner inner = myt3.new Inner();
Thread t1 = new Thread(
new Runnable() {
public void run() {
myt3.m4t1(inner);
}
}, "t1"
);
Thread t2 = new Thread(
new Runnable() {
public void run() {
myt3.m4t2(inner);
}
}, "t2"
);
t1.start();
t2.start();
}
}
?
結(jié)果:
盡管線程t1獲得了對(duì)Inner的對(duì)象鎖,但由于線程t2訪問(wèn)的是同一個(gè)Inner中的非同步部分。所以兩個(gè)線程互不干擾。
?
t1 : Inner.m4t1()=4
t2 : Inner.m4t2()=4
t1 : Inner.m4t1()=3
t2 : Inner.m4t2()=3
t1 : Inner.m4t1()=2
t2 : Inner.m4t2()=2
t1 : Inner.m4t1()=1
t2 : Inner.m4t2()=1
t1 : Inner.m4t1()=0
t2 : Inner.m4t2()=0
?
現(xiàn)在在Inner.m4t2()前面加上synchronized:
?
private synchronized void m4t2() {
int i = 5;
while(i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : Inner.m4t2()=" + i);
try {
Thread.sleep(500);
} catch(InterruptedException ie) {
}
}
}
?
結(jié)果:
盡管線程t1與t2訪問(wèn)了同一個(gè)Inner對(duì)象中兩個(gè)毫不相關(guān)的部分,但因?yàn)閠1先獲得了對(duì)Inner的對(duì)象鎖,所以t2對(duì)Inner.m4t2()的訪問(wèn)也被阻塞,因?yàn)閙4t2()是Inner中的一個(gè)同步方法。
?
t1 : Inner.m4t1()=4
t1 : Inner.m4t1()=3
t1 : Inner.m4t1()=2
t1 : Inner.m4t1()=1
t1 : Inner.m4t1()=0
t2 : Inner.m4t2()=4
t2 : Inner.m4t2()=3
t2 : Inner.m4t2()=2
t2 : Inner.m4t2()=1
t2 : Inner.m4t2()=0
Configuration cfg = new Configuration().configure("/hibernate.cfg.xml");
??for (Iterator iter = cfg.getTableMappings(); iter.hasNext();) {
???Table table = (Table) iter.next();
???for (Iterator iterator = table.getColumnIterator(); iterator.hasNext();) {
????Column column = (Column) iterator.next();
????System.out.println(column.getName());
???}
??}
摘要: Spring Aop Step-By-Step 學(xué)習(xí)筆記(上) ?www.uusam.com ? 最近由于工作需要,要求掌握關(guān)于 Spring 方面的東西。所以花了兩個(gè)星期的時(shí)間來(lái)學(xué)習(xí) Spring 的基本知識(shí),主要包括 Ioc ... 閱讀全文 MRX3F-47B9T-2487J-KWKMF-RPWBY(VOL 中國(guó)工商銀行版)感謝您驗(yàn)證 Microsoft Windows 軟件。 感謝您使用 Windows 正版增值計(jì)劃 計(jì)劃。現(xiàn)在您可以訪問(wèn)正版 Windows 用戶資源。 |
地址:http://tap.javalobby.org/javaee5.mp3
歌詞:
Ladies and gentlemen, this is Java EE 5!
One, two, three, four, five
There's a technology I use day and night
For my application with a web frontend
They told me to use .Net
But I really don′t wanna
So many bugs I fixed last week.
My code is neat and talk is a cheap
I like Glassfish, JSF, persistence API
And as I continue you know they′re gettin′ sweeter
So what can I do I really beg you my Lord
To me codin' it′s just like a sport
All the bad code from the past, let me dump it
Please set in the trumpet
A little bit of injection in my life
A little bit of persistence by my side
A little bit of NetBeans is all I need
A little bit of EJB's what I see
A little bit of standards in the sun
A little bit of XML all night long
A little bit web services here I am
A little bit of code makes me real man
This is Java EE 5!
Jump up and down and move your code around
Shake your head to the sound bury bad code under ground
Move one step left and one step right
One to the front and one to the side
Refactor it once and refactor it twice
If it looks like this you're doin′ it right
A little bit of injection in my life
A little bit of persistence by my side
A little bit of NetBeans is all I need
A little bit of EJB's is what I see
A little bit of standards in the sun
A little bit of XML all night long
A little bit web services here I am
A little bit of code makes me real man
This is Java EE 5!
本文來(lái)源:http://www.aygfsteel.com/Andyluo/archive/2006/06/30/javasong.html
1.下載http://www.eu.apache.org/dist/jakarta/tomcat-5/
這里注意,在jakarta-tomcat-5.0.28.exe以前是有默認(rèn)的admin模塊,在jakarta-tomcat-5.5.9.exe則沒(méi)有安裝默認(rèn)的admin模塊,這時(shí)http://127.0.0.1:8080/admin打開(kāi)時(shí)則會(huì)出現(xiàn)
Tomcat's administration web application is no longer installed by default. Download and install the "admin" package to use it.
因此我們現(xiàn)在需要下載"admin"package 包
把jakarta-tomcat-5.5.x.zip? 與?? jakarta-tomcat-5.5.x-compat.zip? 與? jakarta-tomcat-5.5.x-admin.zip
三個(gè)文件解壓在同一個(gè)目錄中
(如果使用jdk1.4,才需要compat.zip用jdk1.5就可以免了這個(gè)。)
2.修改jakarta-tomcat-5.5.x\conf\tomcat-users.xml.
添加管理員賬號(hào)lizongbo,密碼為lizongbopass.
新xml如下:
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
? <role rolename="tomcat"/>
? <role rolename="role1"/>
? <role rolename="manager"/>
? <role rolename="admin"/>
? <user username="tomcat" password="tomcat" roles="tomcat"/>
? <user username="role1" password="tomcat" roles="role1"/>
? <user username="both" password="tomcat" roles="tomcat,role1"/>
? <user username="lizongbo" password="lizongbopass" roles="admin,manager"/>
</tomcat-users>
有時(shí)在%CATALINA_HOME%\server\webapps\admin\WEB-INF\web.xml里面也要做些修改
<!-- Security is active on entire directory -->
? <security-constraint>
??? <display-name>Tomcat Server Configuration Security Constraint</display-name>
??? <web-resource-collection>
????? <web-resource-name>Protected Area</web-resource-name>
????? <!-- Define the context-relative URL(s) to be protected -->
????? <url-pattern>*.jsp</url-pattern>
????? <url-pattern>*.do</url-pattern>
????? <url-pattern>*.html</url-pattern>
??? </web-resource-collection>
??? <auth-constraint>
????? <!-- Anyone with one of the listed roles may access this area -->
????? <role-name>admin</role-name>
??? </auth-constraint>
? </security-constraint>
? <!-- Login configuration uses form-based authentication -->
? <login-config>
??? <auth-method>FORM</auth-method>
??? <realm-name>Tomcat Server Configuration Form-Based Authentication Area</realm-name>
??? <form-login-config>
????? <form-login-page>/login.jsp</form-login-page>
????? <form-error-page>/error.jsp</form-error-page>
??? </form-login-config>
? </login-config>
? <!-- Security roles referenced by this web application -->
? <security-role>
??? <description>
????? The role that is required to log in to the Administration Application
??? </description>
??? <role-name>admin</role-name>
? </security-role>
無(wú)論是 Authetication ( 身份驗(yàn)證? 還是 Authorization ( 權(quán)限管控? 都只有設(shè)置相關(guān)的 admin ROLE, 當(dāng)你想要新增或修改相關(guān)的 AA, 就必須修改這一個(gè)文件, 來(lái)符合你的環(huán)境.
3.修改jakarta-tomcat-5.5.x\conf\server.xml來(lái)解決編碼問(wèn)題。
(給Connector 添加URIEncoding參數(shù),參考http://blog.csdn.net/darkxie/archive/2004/10/25/TOMCATAPP.aspx)
(可以設(shè)置成GB18030)
??? <Connector port="8080"
?????????????? maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
?????????????? enableLookups="false" redirectPort="8443" acceptCount="200"
?????????????? connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK"
?????????????? compression="on" compressionMinSize="2048"
????? noCompressionUserAgents="gozilla, traviata"
????? compressableMimeType="text/html,text/xml"/>
?
??? <Connector port="8009"
?????????????? enableLookups="false" redirectPort="8443" protocol="AJP/1.3" URIEncoding="GBK"/>
?
4.啟用支持gzip壓縮.
(http://www.linuxaid.com.cn/forum/showdoc.jsp?l=1&i=81169)
添加下列屬性
?compression="on"
????? compressionMinSize="2048"
????? noCompressionUserAgents="gozilla, traviata"
????? compressableMimeType="text/html,text/xml"
?
5.設(shè)置虛擬主機(jī)。
在jakarta-tomcat-5.5.x\下建立文件夾vhost\www.mydomain.com。
然后修改jakarta-tomcat-5.5.x\conf\server.xml
?
<Engine defaultHost="localhost" name="Catalina">
????? <Host appBase="vhost/www.mydomain.com" name="????? </Host>
????? <Host appBase="webapps" name="localhost">
????? </Host>
????? <Realm className="org.apache.catalina.realm.UserDatabaseRealm"/>
??? </Engine>
?
6.添加數(shù)據(jù)庫(kù)驅(qū)動(dòng),更新mail.jar和actiovation.jar
復(fù)制mysql-connector-java-3.0.16-ga-bin.jar,pg74.215.jdbc3.jar到 jakarta-tomcat-5.5.x\common\lib\
還有javamail 1.3.2的mail.jar,jaf-1_0_2的 activation.jar
msSQl 2000 JDBC sp3,msbase.jar,msutil,jar,mssqlserver.jar
?
?
7.配置SSL
參考 http://jakarta.apache.org/tomcat/tomcat-5.5-doc/ssl-howto.html
D:\j2sdk1.4.2_06\bin>%JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA
輸入keystore密碼:? lizongbossl
您的名字與姓氏是什么?
? [tomcat5.5.x]:? tomcat5.5.x
您的組織單位名稱是什么?
? [jakarta]:? jakarta
您的組織名稱是什么?
? [apache]:? apache
您所在的城市或區(qū)域名稱是什么?
? [hzcity]:? hzcity
您所在的州或省份名稱是什么?
? [gdp]:? gdp
該單位的兩字母國(guó)家代碼是什么
? [CN]:? CN
CN=tomcat5.5.x, OU=jakarta, O=apache, L=hzcity, ST=gdp, C=CN 正確嗎?
? [否]:? y
?
輸入<tomcat>的主密碼
??????? (如果和 keystore 密碼相同,按回車):
(必須密碼一致,因此直接回車)
然后再把userhome(例如:C:\Documents and Settings\lizongbo\)下的.keystore復(fù)制到
tomcat的conf\目錄下。
?(例如:D:\jakarta-tomcat-5.5.x\conf\.keystore
配置jakarta-tomcat-5.5.x\conf\server.xml
加上
??? <Connector port="8443"
?????????????? maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
?????????????? enableLookups="false" disableUploadTimeout="true"
?????????????? acceptCount="100" scheme="https" secure="true"
?????????????? clientAuth="false" sslProtocol="TLS"
?????????? keystoreFile="conf/.keystore"
?????????? keystorePass="lizongbossl"> <!--與先前設(shè)置的密碼一致-->
??? </Connector>
8.禁止文件目錄列表,
修改jakarta-tomcat-5.5.x\conf\web.xml,把listing設(shè)置為false
?
??? <servlet>
??????? <servlet-name>default</servlet-name>
??????? <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
??????? <init-param>
??????????? <param-name>debug</param-name>
??????????? <param-value>0</param-value>
??????? </init-param>
??????? <init-param>
??????????? <param-name>listings</param-name>
??????????? <param-value>true</param-value>
??????? </init-param>
??????? <load-on-startup>1</load-on-startup>
??? </servlet>
?
?9.指定了自己的javaEncoding
(參考 http://gceclub.sun.com.cn/staticcontent/html/sunone/app7/app7-dg-webapp/ch6/ch6-4.html?
??? <servlet>
??????? <servlet-name>jsp</servlet-name>
??????? <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
??????? <init-param>
??????????? <param-name>fork</param-name>
??????????? <param-value>false</param-value>
??????? </init-param>
??????????????? <init-param>
??????????? <param-name>javaEncoding</param-name>
??????????? <param-value>GB18030</param-value>
??????? </init-param>
??????? <init-param>
??????????? <param-name>xpoweredBy</param-name>
??????????? <param-value>true</param-value>
??????? </init-param>
??????? <load-on-startup>3</load-on-startup>
??? </servlet>
?10.添加rar,iso等的mime-type映射
避免在瀏覽器里直接打開(kāi)。
<mime-mapping>
<extension>mht</extension>
<mime-type>text/x-mht</mime-type>
</mime-mapping>
<mime-mapping>
??????? <extension>rar</extension>
??????? <mime-type>application/octet-stream</mime-type>
??? </mime-mapping>
??? <mime-mapping>
??????? <extension>iso</extension>
??????? <mime-type>application/octet-stream</mime-type>
??? </mime-mapping>
??? <mime-mapping>
??????? <extension>ape</extension>
??????? <mime-type>application/octet-stream</mime-type>
??? </mime-mapping>
??? <mime-mapping>
??????? <extension>rmvb</extension>
??????? <mime-type>application/octet-stream</mime-type>
??? </mime-mapping>
??? <mime-mapping>
??????? <extension>ico</extension>
??????? <mime-type>image/x-icon</mime-type>
??? </mime-mapping>
10.1對(duì)html靜態(tài)頁(yè)面設(shè)置編碼
<!--? 修改下面兩行以支持靜態(tài)超文本的自動(dòng)編碼
? -->
?<mime-mapping>
? <extension>htm</extension>
? <mime-type>text/html;charset=gb2312</mime-type>
? </mime-mapping>
?<mime-mapping>
? <extension>html</extension>
? <mime-type>text/html;charset=gb2312</mime-type>
? </mime-mapping>
? </web-app>
?
11.添加welcome-file-list,并調(diào)整順序。
?<welcome-file-list>???
??????? <welcome-file>index.jsp</welcome-file>
??????? <welcome-file>index.html</welcome-file>
??????? <welcome-file>index.htm</welcome-file>
??????? <welcome-file>default.html</welcome-file>
??????? <welcome-file>default.htm</welcome-file>
??????? <welcome-file>default.jsp</welcome-file>
??? </welcome-file-list>
--h
|
打印常用啟動(dòng)參數(shù)的描述。 |
--cp:p additional_classpath
|
將指定的類路徑附加到 IDE 的類路徑之前。 |
--cp:a additional_classpath
|
將指定的類路徑附加到 IDE 的類路徑之后。 |
--fontsize size
|
設(shè)置字體大小,在 IDE 用戶界面中用磅表示。如果未使用此選項(xiàng),則字體大小為 11 磅。 |
--jdkhome jdk_home_dir
|
注意:測(cè)試 IDE 時(shí)是采用所支持的 Java 2 SDK 版本進(jìn)行的,并且該版本與 IDE 捆綁在一起;因此,在大多數(shù)情況下,不需要使用此開(kāi)關(guān)。 對(duì)于所有支持的平臺(tái)(除 Mac OS 之外),缺省 JDK 就是與本產(chǎn)品捆綁在一起的 JDK,它位于 <安裝目錄>/java 中。對(duì)于 Mac OS,缺省 JDK 為計(jì)算機(jī)上安裝的最新 JDK。請(qǐng)使用指定的 Java 2 SDK 版本而不要使用缺省的 SDK。在 Microsoft Windows 系統(tǒng)中,缺省情況下,加載器會(huì)在注冊(cè)表中查找并使用最新的可用 SDK。 請(qǐng)?jiān)谏?jí) IDE 使用的 SDK 之前,備份用戶目錄。如果以后需要恢復(fù)到先前的 JDK,可以切換到已備份的用戶目錄,從而確保不丟失任何設(shè)置。 要切換 IDE 的用戶目錄,請(qǐng)使用 -userdir 開(kāi)關(guān)。
|
--Jjvm_option
|
將指定的標(biāo)志直接傳遞給 JVM。 |
--locale language[:country[:variant]]
|
使用指定的語(yǔ)言環(huán)境。支持的語(yǔ)言包括: |
--userdir userdir
|
顯式指定用戶目錄,該目錄是存儲(chǔ)用戶設(shè)置的位置。 如果在 UNIX 系統(tǒng)中未使用此選項(xiàng),則缺省情況下存儲(chǔ)位置為 $HOME/.Creator/2_1 。在 Microsoft Windows 系統(tǒng)中,缺省位置是您第一次啟動(dòng) IDE 時(shí)指定的位置。在大多數(shù)情況下,該位置為 <系統(tǒng)驅(qū)動(dòng)器>:\Documents and Settings\<用戶名>\.Creator\2_1 。您可以在“關(guān)于”對(duì)話框中確定當(dāng)前的用戶目錄。選擇“幫助”>“關(guān)于”,然后選擇“詳細(xì)信息”標(biāo)簽。此標(biāo)簽列出了用戶目錄位置以及其他產(chǎn)品詳細(xì)信息。 |