Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Will Multiple Threads cause Concurrency issue with static methods?

I have a Thread scenerio , in which 3 classes are MainThread.java,NormalWorkerClass1.java,NormalWorkerClass2.java

1 class:

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:

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:

 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()
        }
    }

These are 3 classes. My doubts are:

1 )In a multi threading Environment , i.e. if both class 2 and class 3 accessed at same time , whether 2 and 3 class cause any concurrency issue, because both are using some common methods and classes?

There is no Synchronisation part in this. The web service part consists of another thread part.

2) What will happen when multiple thread access this,

NormalWorkerClass1 instance1=NormalWorkerClass1.getInstance(); // Normal class NormalWorkerClass2 instance2=NormalWorkerClass2.getInstance(); // for other working

because its getInstance() method is a static method , multiple threads will share NormalWorkerClass1 and NormalWorkerClass2 class object values ?

5)Both classes NormalWorkerClass1 and NormalWorkerClass2 calls same common methods.. for e.g.. web service part.. if a thread1 enters into web service part and takes some time to complete ..on that particular moment another thread2 came to use web service part..this might cause any problem in total execution . same case with mail part also..will cause any issue in object clashing. I know each thread has its own stack for execution and have copies of variables

4) Can this Code cause any performance bottleneck? If yes ,How can I improve this code for multi threading and performance improving environment. ?

as i am new to this threading concurrency part..

like image 770
user_vs Avatar asked Aug 12 '15 13:08

user_vs


People also ask

Can multiple threads access static method?

Only one thread can access in one time.

What happens when two threads call the same static method?

Well, the two threads will run concurrently... Nothing to fear if the method is thread safe to begin with. If the static method doesn't modify the state of a common object used by these threads, then nothing wrong will happen. They both run the method at the same time.

Does static methods are thread safe?

A data type or static method is threadsafe if it behaves correctly when used from multiple threads, regardless of how those threads are executed, and without demanding additional coordination from the calling code.

What will happen if multiple threads accessing the same resource?

Multiple threads accessing shared data simultaneously may lead to a timing dependent error known as data race condition. Data races may be hidden in the code without interfering or harming the program execution until the moment when threads are scheduled in a scenario (the condition) that break the program execution.


1 Answers

Where concurrency causes problems is when multiple threads access shared state, your example doesn't have any shared state, it just shows static methods returning new instances of things. If you add static class variables that are accessed concurrently then you will have to worry about thread-safety issues with threads overwriting each others' work or with changes not being visible to other threads.

Calling methods doesn't in itself introduce concurrency problems, accessing and changing the contents of instance and class variables is what causes problems.

like image 54
Nathan Hughes Avatar answered Oct 13 '22 04:10

Nathan Hughes