執行緒同步問題分析

2021-07-05 15:41:23 字數 2810 閱讀 3935

我們先看乙個例子:

1、三個執行緒同時執行乙個物件中的run方法。我的想法是賣100張票,當ticket =< 0的時候,就不再賣票了,也就是ticket不再減少了。但是執行結果非常奇怪。

package com.huai.test;

public class threadtest1 implements runnable

@override

public void run() catch (interruptedexception e)

system.out.println(thread.currentthread().getname()

+ " selling ticket : " + ticket--);

} }public static void main(string args)

}

執行的結果(非常奇怪),正確的結果應該是:5,4,3,2,1這樣的順序

a selling  ticket : 5

d selling  ticket : 2

c selling  ticket : 2

e selling  ticket : 3

b selling  ticket : 4

之所以有這樣的結果,是因為多個執行緒共享同乙個物件。

問題解決:使用同步**塊或者同步方法。

2、同步**塊

我只在定義方法的地方加上了synchronized關鍵字

package com.huai.test;

public class threadtest1 implements runnable

@override

public synchronized void run() catch (interruptedexception e)

system.out.println(thread.currentthread().getname()

+ " selling ticket : " + ticket--);

} }public static void main(string args)

}

結果為:(注意:這裡的執行緒名字的排列順序是不確定的,誰先搶到cup資源誰就先執行)

a selling  ticket : 5

e selling ticket : 4

d selling ticket : 3

c selling ticket : 2

b selling ticket : 1

3、同步塊

在run方法裡面加上synchronized (this) {}

package com.huai.test;

public class threadtest1 implements runnable

@override

public void run() catch (interruptedexception e)

system.out.println(thread.currentthread().getname()

+ " selling ticket : " + ticket--);

}}

} public static void main(string args)

}

結果

a selling  ticket : 5

d selling ticket : 4

e selling ticket : 3

c selling ticket : 2

b selling ticket : 1

補充:當乙個物件object 1在不同的執行緒中執行這個同步方法時,他們(同乙個例項裡的同步方法們)之間會形成互斥,達到同步的效果。但是這個物件所屬的class所產生的另一物件object 2卻能夠任意呼叫這個被加了synchronized關鍵字的方法。

我們用例項說話

package com.huai.test;

public class threadtest1 implements runnable

@override

public void run() catch (interruptedexception e)

system.out.println(thread.currentthread().getname()

+ " selling  ticket : " + ticket--);}}

}public static void main(string args)

}

結果:

從結果可以看出,物件t1 和物件t21 在同步上面是各自不影響的。但是在同乙個物件上面是不共享的。

a  selling  ticket : 5

a2 selling ticket : 5

d selling ticket : 4

d2 selling ticket : 4

e2 selling ticket : 3

e selling ticket : 3

c selling ticket : 2

b2 selling ticket : 2

c2 selling ticket : 1

b selling ticket : 1

執行緒同步問題分析

在多執行緒的處理中,可以利用runnable描述多個執行緒操作的資源,而thread描述每乙個執行緒物件,於是當多個執行緒 訪問統一資源的時候如果處理不當就會產生資料的錯誤操作。模擬乙個賣票程式,將建立若干個執行緒物件實現賣票的處理操作。package cn.pjy.demo 在多執行緒的處理中,可...

執行緒同步問題

昨天簡單研究了一點執行緒的同步問題 package com.pb.thread public class waymakethread 建立乙個執行緒,繼承thread類 class mythread extends thread 建立乙個類,實現runable介面,這不是乙個執行緒類 class m...

執行緒同步問題

多個執行緒在執行的過程中的不確定性引起執行結構的不穩定,同時多個執行緒對同一資料的共享操作,造成操作的不完整性,破壞資料。當某個執行緒在操作車票過程中,尚未操作完成時,其他執行緒也參與進來,操作車票,使車票的資料共享,出現執行緒安全問題。那麼可以通過同步 塊和同步方法的方式來解決執行緒安全問題,實現...