**自併發程式設計網 – ifeve.com
執行緒安全與共享資源
畢冉校對:丁一
允許被多個執行緒同時執行的**稱作執行緒安全的**。執行緒安全的**不包含競態條件。當多個執行緒同時更新共享資源時會引發競態條件。因此,了解j**a執行緒執行時共享了什麼資源很重要。
public void somemethod()
public void somemethod()
public void method2(localobject localobject)
物件成員儲存在堆上。如果兩個執行緒同時更新同乙個物件的同乙個成員,那這個**就不是執行緒安全的。下面是乙個樣例:
public class notthreadsafe
}
如果兩個執行緒同時呼叫同乙個notthreadsafe
例項上的add()
方法,就會有競態條件問題。例如:
notthreadsafe sharedinstance = new notthreadsafe();
new thread(new myrunnable(sharedinstance)).start();
new thread(new myrunnable(sharedinstance)).start();
public class myrunnable implements runnable
public void run()
}
注意兩個myrunnable共享了同乙個notthreadsafe物件。因此,當它們呼叫add()方法時會造成競態條件。
當然,如果這兩個執行緒在不同的notthreadsafe例項上呼叫call()方法,就不會導致競態條件。下面是稍微修改後的例子:
new thread(new myrunnable(new notthreadsafe())).start();
new thread(new myrunnable(new notthreadsafe())).start();
現在兩個執行緒都有自己單獨的notthreadsafe物件,呼叫add()方法時就會互不干擾,再也不會有競態條件問題了。所以非執行緒安全的物件仍可以通過某種方式來消除競態條件。
執行緒控制逃逸規則可以幫助你判斷**中對某些資源的訪問是否是執行緒安全的。
如果乙個資源的建立,使用,銷毀都在同乙個執行緒內完成,資源可以是物件,陣列,檔案,資料庫連線,套接字等等。j**a中你無需主動銷毀物件,所以「銷毀」指不再有引用指向物件。且永遠不會脫離該執行緒的控制,則該資源的使用就是執行緒安全的。
即使物件本身執行緒安全,但如果該物件中包含其他資源(檔案,資料庫連線),整個應用也許就不再是執行緒安全的了。比如2個執行緒都建立了各自的資料庫連線,每個連線自身是執行緒安全的,但它們所連線到的同乙個資料庫也許不是執行緒安全的。比如,2個執行緒執行如下**:
檢查記錄x是否存在,如果不存在,插入x如果兩個執行緒同時執行,而且碰巧檢查的是同乙個記錄,那麼兩個執行緒最終可能都插入了記錄:
執行緒1檢查記錄x是否存在。檢查結果:不存在同樣的問題也會發生在檔案或其他共享資源上。因此,區分某個執行緒控制的物件是資源本身,還是僅僅到某個資源的引用很重要。執行緒2檢查記錄x是否存在。檢查結果:不存在
執行緒1插入記錄x
執行緒2插入記錄x
**自併發程式設計網 – ifeve.com
執行緒安全與共享資源
golang 併發 共享資源安全
首先,我們需要知道 在golang中,多 goroutine 同時操作乙個共享資源時 我們需要保障資源的安全 我們對資源的操作結果要符合我們的預期 當我們未對資源做保護操作時,多個goroutine同時操作同一資源時,就可能會出現問題 例如 count 1 有a b兩個 goroutine 同時拿到...
多執行緒共享資源案例
最近研究了一下多執行緒,主要針對於多執行緒共享同一資源,和多執行緒執行各自的資源 其實主要要就是搞清楚資源的含義 你要操作什麼,什麼就是執行緒的資源!1.先說一下多執行緒執行各自的資源 執行各自的資源從字面意思就可以看出來執行緒執行的資源互不干涉,各自執行各自的。案例如下 package testt...
執行緒的共享資源和私有資源
執行緒共享的環境包括 程序 段 程序的公有資料 利用這些共享的資料,執行緒很容易的實現相互之間的通訊 程序開啟的檔案描述符 訊號的處理器 程序的當前目錄和程序使用者id與程序組id。程序擁有這許多共性的同時,還擁有自己的個性。有了這些個性,執行緒才能實現併發性。這些個性包括 1.執行緒id 每個執行...