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