AKS
AKS

Reputation: 1423

Thread safety for static variables in java

My question is related to thread safety of static variables.

Class A{
private static int test=0;
public static void synchronized  m1(){
    test=test+1;
}
public void synchronized  m2(){
   test=test+1;
}

}

If two threads, t1 having static lock and t2 having object lock, can continue simultaneously, then how will state test of class A will be thread safe?

May be , I am missing something very basic, but not sure how it works.

Based on below answers, I get the impression that if such states have to be made thread safe, then either both locks should be held by a thread which is updating this state, or make sure it is being accessed by either only static methods or only non-static methods. right?

Upvotes: 0

Views: 4515

Answers (2)

outdev
outdev

Reputation: 5502

Its not thread-safe, and you (the question author) explained very well why.

Upvotes: 0

kiheru
kiheru

Reputation: 6618

This is not thread safe. The methods use different monitor objects: the static method uses the class, and the instance method synchronizes using the object instance. You can make the instance method use the class as the monitor object by:

synchronized (A.class) {
...

if you need to. I'd consider making both methods static though, unless you need to access instance variables.

Upvotes: 5

Related Questions