Java 多线程是否会导致静态方法出现并发问题?

Java 多线程是否会导致静态方法出现并发问题?,java,multithreading,concurrency,static,thread-safety,Java,Multithreading,Concurrency,Static,Thread Safety,我有一个线程场景,其中3个类是MainThread.java、NormalWorkerClass1.java、NormalWorkerClass2.java 1类: class MainThread implements Runnable { private Thread thread = null; //private variables .. .. //default Constructor public MainThread(){} public MainThread(int v

我有一个线程场景,其中3个类是MainThread.java、NormalWorkerClass1.java、NormalWorkerClass2.java

1类:

class MainThread implements Runnable

{
private Thread thread = null;
//private variables
..
..
 //default Constructor

 public MainThread(){}

public MainThread(int val){
 this.val=val;
}

    public void start() {
            thread = new Thread(this,"rootthread");
            thread.start();
        }

@Override
    public void run() {

    NormalWorkerClass1 instance1=NormalWorkerClass1.getInstance();  // Normal class
    NormalWorkerClass2 instance2=NormalWorkerClass2.getInstance(); // for other working
    try
        {
            while(true)
            {
                boolean retval=proccessSomething();
                if(retval)
                    {
                      instance1.doMainProcess(arg..);
                    }
                else
                {
                     instance2.doMainProcess(arg..);
                }
            }
        }
    }
2类:

class NormalWorkerClass1
    {
      private ...
      private variables
        public static NormalWorkerClass1 getInstance() {
            return new NormalWorkerClass1();
            }

           public void doMainProcess(arg..)
        {

            Files processing()  
            // same common methods in NormalWorkerClass2
            UtilityAccess ad=UtilityAccess.getInstance();
            ad.Web Service part()
            ad.dB part()
            ad.Mail sending()
        }
    }
3类:

 class NormalWorkerClass2
    {
       private ...
      private variables
        public static NormalWorkerClass2 getInstance() {
            return new NormalWorkerClass2();
            }

           public void doMainProcess(arg..)
        {
            Files processing()
            // same common methods in NormalWorkerClass1
             UtilityAccess ad=UtilityAccess.getInstance();
            ad.Web Service part()
            ad.dB part()
            ad.Mail sending()
        }
    }
这是三门课。 我的疑问是:

1)在多线程环境中,即如果同时访问class 2和class 3,是否 2和3类会导致任何并发问题,因为它们都使用一些常用的方法和类

本节中没有同步部分。 web服务部分由另一个线程部分组成

2) 当多线程访问此

NormalWorkerClass1实例1=NormalWorkerClass1.getInstance();//普通班 NormalWorkerClass2实例2=NormalWorkerClass2.getInstance();//其他工作

因为它的getInstance()方法是静态方法, 多个线程将共享NormalWorkerClass1和NormalWorkerClass2类对象值

5) NormalWorkerClass1和NormalWorkerClass2类都调用相同的通用方法。。例如,web服务部件。。如果一个thread1进入web服务部件并需要一些时间来完成..在那个特定的时刻,另一个thread2开始使用web服务部件..这可能会导致整个执行中出现任何问题。邮件部分也是如此。将导致对象冲突中的任何问题。我知道每个线程都有自己的执行堆栈和变量副本

4) 这段代码会导致性能瓶颈吗?如果是,如何改进此代码以实现多线程和性能改进环境


由于我不熟悉线程并发部分。

当多个线程访问共享状态时,并发会导致问题,您的示例没有任何共享状态,它只显示返回新实例的静态方法。如果您添加了并发访问的静态类变量,那么您将不得不担心线程安全问题,因为线程会覆盖彼此的工作,或者其他线程看不到更改


调用方法本身不会带来并发问题,访问和更改实例和类变量的内容是导致问题的原因。

Nathan Hughes的回答是正确的。我想补充一点,如果
run()
方法触及
MainThread
类的任何实例变量,可能会出现并发问题


还有一件事——也许是显而易见的,也许不是:并发是关于线程,而不是类。当从同一线程调用时,
NormalWorkerClass1
NormalWorkerClass2
不能相互冲突。

1),2)。。4) ?? :D在
getInstance
方法中返回新实例。因此,每个线程都有各自类的实例。您也可以只使用“new”而不是Factory-Method。方法不存在并发问题(静态或其他)。并发问题都围绕着共享的、可变的数据。任何人都无法判断您的示例是否存在并发性问题,因为。。。(请参阅Nathan Hughes的答案了解我的想法)。这种循环线程设计会不会导致Web服务器出现任何性能问题。比如堆过载问题。。。etc@vineeth:无论哪种方式,您都可能在某些时候遇到性能问题。使用有状态方法需要执行锁定,使用无状态方法创建更多的对象(虽然是短期的),并且可能需要调整垃圾收集的完成方式。spring的默认作用域是singleton,在这里不应该有状态或非线程安全的实例变量。spring是一个很好的例子。通过限制线程数量,使用ExecutorService将是更好的选择