同步的幾種常用方法

2021-05-26 18:02:48 字數 1915 閱讀 1410

最簡單的執行緒同步的例子

本文,旨在**幾種常用的同步的方法:本文的同步指對於一點程式乙個時間點只有乙個程式在執行,必須乙個執行完了,另乙個才能執行。

1. 物件同步(同一例項)

成員方法同步

public class mytestthread extends thread catch (interruptedexception e) 

system.out.println(thread.currentthread().getname()+" left");

}}

這樣的同步對於下面多個執行緒使用相同例項是有效的,可以保證在乙個時間點只有乙個在執行:
mytestthread a = new mytestthread();//use the same instance

thread t1 = new thread(a, "a");

thread t2 = new thread(a, "b");

t1.start();

t2.start()

塊同步有時候,我們想把鎖加在乙個**塊上,而不是整個方法上

private object lock=new object();

public void run() catch (interruptedexception e)

system.out.println(thread.currentthread().getname()+" left");

} }

其實上面鎖定乙個方法,等同於下面的:

public  void run()  catch (interruptedexception e) 

system.out.println(thread.currentthread().getname()+" left");

} }

2. 類同步(多個例項)

對於下面這種多個例項,使用1的方法是不能同步的。要想實現同步,我們有下面幾種方法。

mytestthread a1 = new mytestthread();

thread t1 = new thread(a1, "a");

mytestthread a2 = new mytestthread();//use different instance

thread t2 = new thread(a2, "b");

t1.start();

t2.start();

變數鎖:可以增加乙個靜態變數,對它進行加鎖(後面將說明鎖定的物件)。

同步**如下:

public class mytestthread extends thread catch (interruptedexception e) 

system.out.println(thread.currentthread().getname()+" left");

} }}

還可以加鎖在類上如下:

public  void run()  catch (interruptedexception e) 

system.out.println(thread.currentthread().getname()+" left");

} }

總結:1. 無論synchronized關鍵字加在方法上還是物件上,它取得的鎖都是物件,而不是把一段**或函式當作鎖,所以首先應知道需要加鎖的物件

2. 用synchronized 來鎖定乙個物件的時候,如果這個物件在鎖定**段中被修改了,則這個鎖也就消失了。

C 中幾種同步的方法

在網上有很多關於執行緒同步的文章,其實執行緒同步有好幾種方法,下面簡單的做一下歸納。一 volatile關鍵字 volatile是最簡單的一種同步方法,當然簡單是要付出代價的。它只能在變數一級做同步,volatile的含義就是告訴處理器,不要將我放入工作記憶體,請直接在主存操作我。www.bitsc...

多執行緒的幾種實現方法 同步的幾種實現方法

多執行緒有兩種實現方法,分別是繼承 thread 類與實現 runnable介面 同步的實現方面有兩種,分別是 synchronized,wait 與notify wait 使乙個執行緒處於等待狀態,並且釋放所持有的物件的 lock。sleep 使乙個正在執行的執行緒處於睡眠狀態,是乙個靜態方法,呼...

C 執行緒同步的幾種方法

幾種方法 我們在程式設計的時候,有時會使用多執行緒來解決問題,比如你的程式需要在後台處理一大堆資料,但還要使使用者介面處於可操作狀態 或者你的程式需要訪問一些外部資源如資料庫或網路檔案等。這些情況你都可以建立乙個子執行緒去處理,然而,多執行緒不可避免地會帶來乙個問題,就是執行緒同步的問題。如果這個問...