问题
Are the primitive data types like int & short thread-safe in Java? I have executed the following code and couldn\'t see expected result 500 some times.
public class SampleThree extends Thread
{
static long wakeUpTime = System.currentTimeMillis() + (1000*20);
static int inT;
public static void main(String args[])
{
System.out.println(\"initial:\" + inT);
for(int i=0; i<500; i++)
new SampleThree().start();
try {
Thread.sleep(wakeUpTime - System.currentTimeMillis() + (1000*30));
System.out.println(\"o/p:\" + inT);
}
catch(Exception e){
e.printStackTrace();
}
}
public void run()
{
try {
long s = wakeUpTime - System.currentTimeMillis();
System.out.println(\"will sleep ms: \" + s);
Thread.sleep(s);
inT++; // System.out.println(inT);
}
catch(Exception e) {
e.printStackTrace();
}
}
}
Here concurrently 500 thread will update the int variable inT. Main thread after waiting for concurrent update to be completed, prints inT value.
Find similar example here
回答1:
There are three ways in which they're not safe:
longanddoublearen't even guaranteed to be updated atomically (you could see half of a write from a different thread)- The memory model doesn't guarantee that you'll see the latest updates from one thread in another thread, without extra memory barriers of some kind
- The act of incrementing a variable isn't atomic anyway
Use AtomicInteger etc for thread-safe operations.
回答2:
Primitive types are not thread safe. Check this tutorial.
回答3:
I would suggest using classes in java.util.concurrent.atomic. They are designed for thread-safety and in some cases the JVM can take advantage of hardware features to optimize.
来源:https://stackoverflow.com/questions/9278764/are-primitive-datatypes-thread-safe-in-java