簡體   English   中英

從不相關的類調用靜態同步方法是否安全?

[英]Is it safe to call a static synchronized method from unrelated classes?

我有一個使用static synchronized方法進行HTTP調用的類。

我也有一個ExecutorService

有多個Runnable類調用此方法。 該方法將接受URL,POST / GET信息和參數,如果響應不是200,則返回錯誤代碼,或者由Runnable類進一步處理XML字符串。

如果多個線程在放入ExecutorService后調用此方法,這可以嗎? 它會失敗嗎?

通過ExecutorService處理多個HTTP調用的理想方法是什么?

關於“線程安全”的任何問題都必須是關於可變共享數據的問題 除非您的線程共享可變數據,否則沒有線程安全問題。

如果任何一個線程的操作不可能將對象/組置於其他線程可以看到的“壞”狀態,則程序中的可變對象或一組可變對象是“線程安全的”。

保證對象/組的線程安全的最簡單,最常用的方法是使用互斥 (即, synchronized塊和/或方法)。 如果修改或讀取數據的每個方法僅在同一對象上synchronized的代碼塊內完成,並且如果mutator函數始終確保對象/組在離開任何synchronized塊之前處於有效狀態,那么object / group將是“線程安全的”。


您的問題沒有提到任何數據。 您的問題沒有提到數據是否存在任何可能存在的“無效”狀態。您的問題涉及一種方法,但沒有提及是否有任何其他方法可以訪問相同的數據。

如果所討論的方法是static並且是synchronized ,那么這將保證沒有兩個線程能夠同時進入該方法,但如果有任何其他方法,那么這將不會使數據“線程安全”訪問或修改相同的數據。

訪問數據的所有代碼塊和/或方法必須synchronized ,並且它們必須在同一個鎖對象上同步。


實際上,同步每次訪問可能是過度的。 但是,如果不知道線程共享哪些數據,以及他們對數據做了什么,就無法知道。

這都是關於數據的。

是的,它是Java中synchronize標簽的主要觀點:)

這就像在函數開頭鎖定互斥鎖,並在返回結束時解鎖相同的互斥鎖。

在這種情況下,互斥鎖是按對象方式的,因此調用同步方法將鎖定其他方法。 意識到

讓ExecutorService任務調用靜態同步方法將成為瓶頸。 一次只能有一個線程執行此方法。

如果ExecutorService中的所有任務都需要進行此調用,那么您將失去擁有多個線程的目的,因為大多數線程可能會花時間等待獲取類上的監視器,以便它們可以調用靜態方法。

靜態同步方法用於保護共享狀態免受不安全的並發訪問。 為每個任務賦予自己的狀態並盡可能地消除共享比讓所有線程輪流訪問共享資源要好得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM