Java 多线程应用中的静态方法

Java 多线程应用中的静态方法,java,static,Java,Static,我在一个类中有一个函数,它只是屏蔽输入卡号。我之所以将其同步,是因为我不希望有多个线程同时调用我的maskcard函数。我的问题是,我应该让这个函数静态更高效、更干净吗?现在,无论我在哪里调用maskcard函数,我都在调用一个实例 public class CardMasker { public synchronized String maskCardNumber(String cardNumber) { .. .. } } I您保

我在一个类中有一个函数,它只是屏蔽输入卡号。我之所以将其
同步
,是因为我不希望有多个线程同时调用我的maskcard函数。我的问题是,我应该让这个函数
静态
更高效、更干净吗?现在,无论我在哪里调用maskcard函数,我都在调用一个实例

public class CardMasker {

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

}

I您保持方法实例的特定性,即您当前实现方法的方式:

public synchronized String maskCardNumber(String cardNumber)
在这里,在同一实例上工作的所有线程都将以同步方式访问该方法

如果要使其
静态同步
,请考虑以下几点:

  • 它是否执行需要以同步方式访问的操作,而不考虑此类的任何实例。如果是,则没有必要保持它的实例特定性,因为使用该类的不同实例的线程仍然能够同时调用该方法

更好的解决方案是确保只有一个CardMasker实例,并使用非静态同步maskCardNumber

我的问题是,我是否应该让这个函数保持静态,以便更高效、更干净

不,这不会提高效率。速度差(如果有)可以忽略不计

此外,如果随后使方法
同步
,则会造成并发瓶颈。这不需要在非
静态
情况下发生;例如,如果您通过使用单例来抵制“节省空间”(或其他)的诱惑。事实上,如果每个线程都有自己的线程限制类实例来实现这个helper方法,那么这个方法可能根本不需要同步


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

有用。因此,在决定哪一个适合您的要求后,我认为这个问题不值得否决。@sᴜʀᴇsʜᴀᴛᴛᴀ : 我完全同意你的看法。伙计们,请不要在没有说明原因的情况下否决一个问题。如果我这样做的话,只有一个CarkMasker实例。好吗?或者我也应该同步getInstance()方法?公共静态CardMasker getInstance(){如果(null==instance){instance=new CardMasker();}返回实例;}有不同的方法来实现线程安全的单例,您可以在inet中找到示例。但是我建议考虑一个依赖注入框架,比如Spring或Guice