2013-12-23 91 views
-1

我有一個類,它只是掩碼輸入卡號的功能。我已經做到了​​,因爲我不想讓多個線程同時調用我的maskcard函數。我的問題是,我應該使這個功能static更有效率和乾淨?現在,我打電話給我的面具卡功能的地方,我打電話給一個實例。多線程應用程序的靜態方法

public class CardMasker { 

    public synchronized String maskCardNumber(String cardNumber) 
    { 
     .. 
     .. 
    } 

} 
+0

有用的紅色:http://stackoverflow.com/questions/578904/how-do-synchronized-static-methods-work-in-java,決定後,哪一個適合您的要求。 –

+1

我不認爲這個問題值得投票。 –

+0

@sᴜʀᴇsʜᴀᴛᴛᴀ:我完全同意你的看法。請不要在沒有說明理由的情況下倒下問題。 –

回答

1

更好的解決方案是確保您只有一個CardMasker實例並使用非靜態同步maskCardNumber。

+0

+1我同意。在所有線程中共享相同的實例。 –

+0

如果我只是這樣做,只有一個CarkMasker實例。它很好嗎?或者我應該同步我的getInstance()方法? \t \t 公共靜態CardMasker的getInstance(){ \t \t如果(空==實例){ \t \t \t實例=新CardMasker(); \t \t} \t \t return instance; \t} – Anita

+0

有不同的方法來創建一個線程安全的單例,你可以在inet中找到例子。但我建議考慮像Spring或Guice這樣的依賴注入框架 –

1

我你保持方法實例具體即當前已執行的方式:

public synchronized String maskCardNumber(String cardNumber) 

這裏都在同一個實例的工作將訪問同步的方式方法的線程。

如果你想讓它static synchronized,這裏要考慮的要點:

  • 是否執行哪些需要同步的時尚這個類的任何實例來進行訪問,不論操作。如果是的話,那麼就沒有必要保持它的具體實例,因爲使用這個類的不同實例的線程仍然可以同時調用該方法。
1

我的問題是,我應該讓這個功能更加高效和乾淨嗎?

不,它不會使效率更高。速度上的差異(如果有的話)可以忽略不計。

此外,如果您然後制定方法​​,則會創建併發瓶頸。這不需要發生在非static的情況下;例如,如果您抵制使用單身人士「節省空間」(或某物)的誘惑力。事實上,如果每個線程都有自己的線程限制實現此輔助方法的類的實例,那麼該方法可能根本不需要同步。

此外,這是一個問題或意見,但靜態方法不比實例方法更「乾淨」。