2013-12-23 2 views
-1

У меня есть функция в классе, которая просто маскирует номер входной карты. Я сделал это synchronized, потому что я не хочу, чтобы более одного потока вызывал мою функцию маскировки одновременно. Мой вопрос: должен ли я сделать эту функцию 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 деЫпзЬапсе() { \t \t если (нуль == экземпляр) { \t \t \t экземпляр = новый CardMasker(); \t \t} \t \t экземпляр возврата; \t} – Anita

+0

Существуют различные подходы к созданию потокобезопасного синглтона, вы можете найти примеры в inet.Но я предлагаю рассмотреть структуру инъекций зависимостей, например Spring или Guice –

1

Я вам сохранить экземпляр метода конкретных т.е., как вы реализовали его в настоящее время:

public synchronized String maskCardNumber(String cardNumber) 

Здесь все нити, работающие на том же экземпляре будет доступ к этому методу в синхронно.

Если вы хотите, чтобы сделать его static synchronized, вот точки, которые необходимо учитывать:

  • это выполнять ли операцию, которая должна быть доступна в синхронном образом, независимо от любого экземпляра этого класса. Если да, то нет смысла указывать конкретный экземпляр, потому что потоки, использующие разные экземпляры этого класса, все равно смогут вызвать метод одновременно.
1

Мой вопрос: должен ли я сделать эту функцию статической, чтобы быть более эффективной и чистой?

Нет. Это не сделает его более эффективным. Разница в скорости (если она вообще есть) будет незначительной.

Кроме того, если вы затем сделаете метод synchronized, вы создадите узкое место параллелизма. Это не должно происходить в случае не static; например, если вы сопротивляетесь соблазну «сэкономить место» (или что-то еще) с помощью синглета. В самом деле, если каждый поток имеет свой собственный экземпляр с ограниченным потоком класса, который реализует этот вспомогательный метод, то, вероятно, этот метод вообще не нужно синхронизировать.

Кроме того, это вопрос или мнение, но статические методы не более «чисты», чем методы экземпляра.

Смежные вопросы