2013-12-23 41 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的情况下;例如,如果您抵制使用单身人士“节省空间”(或某物)的诱惑力。事实上,如果每个线程都有自己的线程限制实现此辅助方法的类的实例,那么该方法可能根本不需要同步。

此外,这是一个问题或意见,但静态方法不比实例方法更“干净”。