Re: Is 'new' operator thread-safe?
xie bo wrote:
Reference? Oh, I dunno, but I'd be willing to
bet you'll find something in the JLS.
I checked JLS and following is citation.
-------
Section 17.5 Final Field Semantics
...
An object is considered to be completely initialized when its
constructor finishes. A thread that can only see a reference to an
object after that object has been completely initialized is guaranteed
to see the correctly initialized values for that object's final fields.
-------
Is the above reference mean '"new" operator is thread-safe for Java'?
Thanks!
Not necessarily. It depends, as Eric pointed out, on what the
constructor does:
public class SynchTest {
static int count1 = 0;
static int count2 = 0;
public static void main(String[] args) {
Runnable myRun = new Runnable() {
public void run() {
new SynchTest();
}
};
Thread[] allThreads = new Thread[10];
for(int i=0; i<allThreads.length; i++){
allThreads[i] = new Thread(myRun);
}
for(Thread t : allThreads){
t.start();
}
for(Thread t : allThreads){
try {
t.join();
} catch (InterruptedException e) {
// IGNORE INTERRUPT
}
}
System.out.printf(
"Actual=%d count1=%d count2=%d%n",
allThreads.length, count1, count2
);
}
public SynchTest() {
badIncrement();
goodIncrement();
}
private void goodIncrement() {
synchronized (this.getClass()) {
count1++;
}
}
private void badIncrement() {
int x = count2;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// IGNORE INTERRUPTS
}
x++;
count2 = x;
}
}