Java Thread in JVM (轉)
Thread in JVM
(wang hailong)
本文從JVM的角度探討Java Thread的語法和編譯結果。如果需要獲得第一手資料,請直接訪問以下的資源——Java語言規範,Java虛擬機器規範中有關執行緒的定義說明。
本文旨在介紹這些比較重要的執行緒相關的規範,基本上不另作發揮。(除了提到的“公共語言基礎構造”。:-)
:namespace prefix = o ns = "urn:schemas--com::office" />
Java Language Specification
JVM Specification
Microsoft CLI -- Common Language Infrastructure (sorry, off the topic :-)
/ecma/">
1.synchronized method 的java語言規範
詳見。
用synchronized關鍵字修飾的方法,分為兩種情況:(static)靜態方法,和例項方法。
(static)靜態方法的“鎖”是這個擁有這個方法的的Class物件;例項方法的“鎖”是this,擁有這個方法的當前物件例項。
怎麼理解這段話,看一看下面的例子就明白了。
下面兩段程式碼的效果完全相同。程式碼1 ==程式碼2。
程式碼1:
class Test {
int count;
synchronized void bump() { count++; }
static int clasunt;
static synchronized void classBump() {
classCount++;
}
}
程式碼2:
class BumpTest {
int count;
void bump() {
synchronized (this) {
count++;
}
}
static int classCount;
static void classBump() {
try {
synchronized (Class.forName("BumpTest")) {
classCount++;
}
} catch (ClassNotFoundException e) {
...
}
}
}
2.synchronized關鍵字的編譯結果
這一節,我們來看一看synchronized關鍵字編譯之後的java虛擬機器指令是什麼。
如果需要第一手資料,請參見java虛擬機器規範相關的部分
這段規範裡面講到,java虛擬機器規範提供兩條指令,monitorenter和monitorexit,來支援執行緒。但是對於上一節講到的,用synchronized修飾的方法來說,並不使用這兩個方法,而只是簡單地用ACC_SYNCHRONIZED標誌修飾。虛擬機器方法的時候會檢查這個標誌,進行同步。
synchronized語句的編譯結果對應monitorenter和monitorexit兩條指令。
比如,下面的程式碼:
void onlyMe(Foo f) {
synchronized(f) {
doSomething();
}
}
的編譯結果是
Method void onlyMe(Foo)
0 aload_1 // Push f
1 astore_2 // Store it in local variable 2
2 aload_2 // Push local variable 2 (f)
3 monitorenter // Enter the monitor associated with f
4 aload_0 // Holding the monitor, pass this and...
5 invokevirtual #5 // ...call Example.doSomething()V
8 aload_2 // Push local variable 2 (f)
9 monitorexit // Exit the monitor associated with f
10 return // Return normally
11 aload_2 // In case of any throw, end up here
12 monitorexit // Be sure to exit monitor...
13 athrow // ...then rethrow the value to the invoker
3.monitorenter和monitorexit
詳見
monitorenter定義的一段節錄:
Operation : Enter monitor for
Operand Stack : ..., objectref
Description :
The objectref must be of type reference
.
Each object has a monitor associated with it. The thread that executes monitorenter gains ownershof the monitor associated with objectref. If another thread already owns the monitor associated with objectref, the current thread waits until the object is unlocked, then tries again to gain ownership. If the current thread already owns the monitor associated with objectref, it increments a counter in the monitor indicating the number of times this thread has entered the monitor. If the monitor associated with objectref is not owned by any thread, the current thread becomes the owner of the monitor, setting the entry count of this monitor to 1.
這段話的意思是說,monitorenter操作的目標一定要是一個物件,型別是reference。Reference實際就是堆裡的一個存放物件的地址。每個物件(reference)都有一個monitor對應,如果有其它的執行緒獲取了這個物件的monitor,當前的執行緒就要一直等待,直到獲得monitor的執行緒放棄monitor,當前的執行緒才有機會獲得monitor。
如果monitor沒有被任何執行緒獲取,那麼當前執行緒獲取這個monitor,把monitor的entry count設定為1。表示這個monitor被1個執行緒佔用了。
當前執行緒獲取了monitor之後,會增加這個monitor的時間計數,來記錄當前執行緒佔用了monitor多長時間。
我們看到,monitor這個詞在java虛擬機器規範規定出現,但是在java語言和文件裡面並沒有出現。monitor是藏線上程同步後面的原理和概念。
4.Threads and Locks
詳見。
這段規範詳細地介紹了thread和lock的原理。下面給出這段規範的highlight。
8.4 Nonatomic Treatment of double
and long
Variables (double和long型別的非原子操作。)
8.7 Rules for volatile
Variables
8.10 Example: Possible S
8.11 Example: Out-of-Order Writes
如果對列出的這些highlight感興趣,請訪問相應的java虛擬機器規範網址。
5.Why specification?
本文主要討論java相關規範的內容。規範文件非常重要,尤其對於java,這種生成中間程式碼的語言來說。
上面說的是java的相關規範。這裡順便提一下微軟.Net的相關規範。
微軟的“公共語言基礎構造”規範:
Microsoft CLI -- Common Language Infrastructure (sorry, off the topic :-)
這個網址上有C#語言規範,CLI規範的。
Enjoy it. :-)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992997/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- JVM救不了Java(轉載)JVMJava
- Java Thread實現讀寫同步 (轉)Javathread
- Java Thread應該注意的問題 (轉)Javathread
- JVM(JAVA虛擬機器介紹) (轉)JVMJava虛擬機
- JVM(JAVA虛擬機器介紹)(轉)JVMJava虛擬機
- Exception in thread "main" java.lang.NoClassDefFoundError錯誤資訊(轉帖)ExceptionthreadAIJavaError
- Java-關於ThreadJavathread
- 如何分析java Thread DUMPJavathread
- java Thread的狀態分析Javathread
- Three ways to create Multi Thread in JavathreadJava
- 【Java】JVM複習JavaJVM
- [轉載] Java Challengers#1:JVM中的方法過載JavaJVM
- Java 中的執行緒 threadJava執行緒thread
- Exception in thread "main" java.lang.UnsupportedClassVersionError:ExceptionthreadAIJavaError
- Exception in thread "main" java.lang.NoClassDefFoundErrorExceptionthreadAIJavaError
- Java報錯:Exception in thread "main" java.lang.UnsupportedClassVersionErrorJavaExceptionthreadAIError
- 解析Java物件引用與JVM自動記憶體管理(轉)Java物件JVM記憶體
- Java當中的JVMJavaJVM
- JVM(八):Java 物件模型JVMJava物件模型
- Java JVM——8.堆JavaJVM
- jvm系列:Java GC 分析JVMJavaGC
- jvm java回收機制JVMJava
- Java中Thread 和Runnable 深入理解Javathread
- Java多執行緒(二):Thread類Java執行緒thread
- Java之Thread類的常用方法 .sleep()Javathread
- java多執行緒之Thread類Java執行緒thread
- Java多執行緒Thread類使用Java執行緒thread
- Java Thread的join() 之刨根問底Javathread
- Java中Runnable和Thread的區別Javathread
- Java 中Thread 和Runnable的區別Javathread
- Thread Dump 和Java應用診斷threadJava
- 《java學習二》jvm效能優化-----認識jvmJavaJVM優化
- 從 pthread 轉換到 std::threadthread
- [轉帖]TLAB(Thread Local Allocation Buffer)thread
- 【轉】深入理解JVM--JVM垃圾回收機制JVM
- 揭祕JAVA JVM內幕JavaJVM
- Java虛擬機器(JVM)Java虛擬機JVM
- java面試彙總:JVM篇!Java面試JVM