【问题标题】:Will Multiple Threads cause Concurrency issue with static methods?多线程会导致静态方法的并发问题吗?
【发布时间】:2015-08-12 13:15:12
【问题描述】:

我有一个线程场景,其中 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()
        }
    }

这是 3 个类。 我的疑问是:

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

这里没有同步部分。 Web 服务部分由另一个线程部分组成。

2) 多线程访问this会发生什么,

NormalWorkerClass1 instance1=NormalWorkerClass1.getInstance(); //普通类 NormalWorkerClass2 instance2=NormalWorkerClass2.getInstance(); // 用于其他工作

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

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

4) 此代码会导致任何性能瓶颈吗?如果是,我该如何改进此代码以用于多线程和性能改进环境。 ?

因为我是这个线程并发部分的新手..

【问题讨论】:

  • 1), 2) .. 4) ?? :D 在getInstance 方法中,您返回新实例。所以每个线程都有自己的相应类的实例。你也可以只使用“new”而不是工厂方法。
  • 方法(静态或其他)不存在并发问题。并发问题都围绕共享的、可变的数据。任何人都无法判断您的示例是否存在并发问题,因为......(请参阅 Nathan Hughes 的回答,了解我的目标)。

标签: java multithreading concurrency static thread-safety


【解决方案1】:

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

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

【讨论】:

  • 这种循环线程设计是否会导致 Web 服务器出现任何性能问题。比如堆过载问题...等等
  • @vineeth:无论哪种方式,您都可能在某些时候遇到性能问题。使用有状态的方法需要进行锁定,使用无状态的方法可以创建更多对象(尽管是短暂的),并且可能需要调整垃圾收集的完成方式。使用 spring,默认范围是单例,其中不应该有有状态或非线程安全的实例变量。 spring 是一个很好的例子。
  • 使用 ExecutorService ,通过限制线程数会是更好的选择
【解决方案2】:

内森的休斯回答是正确的。我要补充一点,如果您的run() 方法触及MainThread 类的任何实例变量,则可能存在并发问题。

还有一件事——也许很明显,也许不是:并发是关于线程,而不是类。 NormalWorkerClass1NormalWorkerClass2 在同一个线程调用时不能相互冲突。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多