在java中,我有2個線程在我的客戶端,一個是控制網絡流量,另一個是處理消息,繪製遊戲等。我試圖做的是當數據包到達時,網絡線程將調用messageReceived遊戲線程的方法,包含消息作爲參數。如果我將函數messageReceived設置爲synchronized,並且在messageReceived函數結束之前有兩個數據包序列地出現,或者它不會阻止,並且數據包丟失,因爲網絡線程無法調用已經在使用的messageReceived函數,它會阻止網絡線程嗎?通過遊戲線程?同步阻塞?
Q
同步阻塞?
1
A
回答
1
當您使用synchronized關鍵字來同步代碼段時,當另一個線程進入想要訪問該段時,它將阻塞,直到它可以訪問。
0
正確,你在IO線程上阻塞。你只想在messageReceived()上做一些簡單的工作,因爲這可能只是在某種FIFO中排隊消息,以便處理線程稍後處理。你的同步塊應該儘可能小。
0
如果線程在類中調用同步方法,則所有其他線程將被阻塞,以調用該類中的任何同步方法,因爲對象鎖不可用。如果你的messageReceived不在任何共享資源上工作,那麼保持它不同步。如果它使用某個共享資源,則嘗試通過將該代碼包裝在同步塊中來最小化同步代碼。
0
聽起來好像你正試圖解決一個問題,如果你使用了更主流的設計模式,如Observer模式,那麼這個問題很容易避免。 http://en.wikipedia.org/wiki/Observer_pattern
0
是,如果隱式鎖已被另一個線程鎖定,則會阻塞線程。但有一個無阻塞的選擇 - java.util.concurrent.locks.Lock
這是更靈活
Lock.tryLock()
- 獲取鎖,只有當它是免費的,在調用時
和
Lock.tryLock(long time, TimeUnit unit)
- 如果在給定的等待時間內空閒並且當前線程尚未中斷編輯。
0
它很容易概念化,但更多的是一個視覺的人。這裏有一些代碼幫助我很久以前瞭解了興奮的syncorized以及它的工作原理。如果您觀察輸出,您將在將同步屬性添加到打印功能時看到輸出,而您從不會看到As和Bs混合在一起。但是當你刪除它時,你會看到一個非常不同的輸出。一旦你看到它,它應該是直截了當的。
public class Main {
public static void main(String[] args) {
(new ThreadA()).start();
(new ThreadB()).start();
}
// try it with removing the synchronized: public static void print(String str) {
public static synchronized void print(String str) {
for(int i = 0; i<100; i++)
System.out.print(str);
System.out.println();
}
public static class ThreadA extends Thread {
public void run() {
while(true) {
print("A");
}
}
}
public static class ThreadB extends Thread {
public void run() {
while(true) {
print("B");
}
}
}
}
相關問題
- 1. 默認爲Javascript同步(阻止)或異步(非阻塞)
- 2. 你如何使YUI同步/阻塞XMLHttpRequest
- 3. Spring 4.1.6 JdbcTemplate阻塞和同步?
- 4. jQuery同步非阻塞AJAX調用
- 5. 在java中阻塞(同步)ftp下載?
- 6. 是否在同步GCD隊列上放置一個阻止阻塞並暫停其他阻塞的阻塞?
- 7. ASP.Net異步阻塞UI
- 8. 異步與非阻塞
- 9. 將阻塞同步代碼轉換爲異步
- 10. 包裝紙異步計算到同步(阻塞)計算
- 11. 將異步任務與阻塞同步任務混合使用
- 12. mpi:阻塞與非阻塞
- 13. C++非阻塞異步計時器
- 14. 異步/非阻塞查詢中的SQLDeveloper
- 15. C#異步套接字通信阻塞
- 16. PHP SNMP v2步行碎片/阻塞
- 17. 多個異步調用阻塞
- 18. Android/Java線程同步:while(true){}導致阻塞
- 19. 不阻塞UI線程的同步等待
- 20. 排隊使用StringRequest和RequestFuture進行阻塞同步呼叫
- 21. 「同步I/O」是否意味着「阻塞I/O」?
- 22. Apache的FileUtils中的方法執行同步(阻塞)I/O嗎?
- 23. 瞭解非阻塞線程同步和Thread.MemoryBarrier
- 24. 如何同步/阻塞是事件/委託訂閱?
- 25. std :: launch :: async被阻塞,像一個同步進程
- 26. Boost async_read vs阻塞同步線程 - 性能差異?
- 27. 如何使用異步事件管理線程阻塞和解除阻塞?
- 28. 帶延遲的阻塞/非阻塞
- 29. 嵌套Socket阻塞非阻塞SocketHi
- 30. 非阻塞PASV襪子和阻塞
'synchronized'將會阻塞,直到資源被其他線程釋放。 – 2013-05-03 17:47:11
謝謝,所以將messageReceived同步而不會丟包的危險是安全的。 – deniz 2013-05-03 17:48:56
是的,但保持同步塊的簡短。只要有時間按順序接受和處理所有數據包,就不會有問題,因此在獲取數據包之前,沒有OS緩衝區會填滿並丟失數據包。 – 2013-05-03 17:50:33