線程同步

研究了servlet是否線程安全後,又想起一個問題,就是如何考慮線程同步?
資料上說:線程安全問題都是由全局變量及靜態變量引起的。而如果每個線程中對全局變量、靜態變量只有讀操作,而無寫操作,一般來說,這個全局變量是線程安全的;若有多個線程同時執行寫操作,一般都需要考慮線程同步,否則就可能影響線程安全。

那麼在java中,如何考慮線程同步呢?
java裏一般有2種方法進行同步:同步方法和同步語句塊。
synchronized用於設置同步,它所定的是調用這個同步方法對象,也就是同一個對象在不同線程中執行這個方法時,他們是互斥的,但是這個方法所屬的其他對象可以任意調用這個方法。

下面給出一些參考:

1。同步方法
Public synchronized void methodAAA()
{

//….

}

它等同於下面:
public void methodAAA()
{

synchronized (this) // this是調用這個方法的對象

{

//…..

}

}

2。同步語句塊
public void method3(SomeObject so)
{

synchronized(so)

{

//…..

}

}
鎖就是so這個對象,當有一個明確的對象作爲鎖時,就可以這樣寫程序,但當沒有明確的對象作爲鎖,只是想讓一段代碼同步時,可以創建一個特殊的instance變量(它得是一個對象)來充當鎖:
class Foo implements Runnable
{

private byte[] lock = new byte[0]; // 特殊的instance變量

Public void methodA()

{

synchronized(lock) { //… }

}

//…..

}

3.將synchronized作用於static 函數,示例代碼如下:

Class Foo
{

public synchronized static void methodAAA() // 同步的static 函數

{

//….

}

public void methodBBB()

{

synchronized(Foo.class) // class literal(類名稱字面常量)

}

}

代碼中的methodBBB()方法是把class literal作爲鎖的情況,它和同步的static函數產生的效果是一樣的,取得的鎖很特別,是當前調用這個方法的對象所屬的類(Class,而不再是由這個Class產生的某個具體對象了)。
發佈了50 篇原創文章 · 獲贊 53 · 訪問量 35萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章