Java Thread in JVM (轉)

worldblog發表於2007-12-13
Java Thread in JVM (轉)[@more@]

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虛擬機器規範提供兩條指令,monitorentermonitorexit,來支援執行緒。但是對於上一節講到的,用synchronized修飾的方法來說,並不使用這兩個方法,而只是簡單地用ACC_SYNCHRONIZED標誌修飾。虛擬機器方法的時候會檢查這個標誌,進行同步。

synchronized語句的編譯結果對應monitorentermonitorexit兩條指令。

比如,下面的程式碼:

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 ectratio="t" v:ext="edit">dbrt.gif" src="file:///C:DOCUME~1ADMINI~1LOCALS~1Tempmsohtml11clip_image001.gif">...

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章