volatile 修饰的变量和没有volatile 修饰的变量,都不具备原子特性 直接上代码
public class CompareVolatileTest {
public volatile int inc = 0 ;
public int inc1 = 0 ;
public static void main (String[] args) {
final CompareVolatileTest test = new CompareVolatileTest();
for (int i = 0 ; i < 1000 ; i++) {
new Thread(){
@Override
public void run () {
for (int j = 0 ; j < 10 ; j++) {
test.inc++;
test.inc1++;
}
System.out .println("test.inc==================" +test.inc+"==============test.inc1=================" +test.inc1);
}
}.start();
}
try {
Thread.sleep(3000 );
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out .println(test.inc);
System.out .println(test.inc1);
}
}
更高级的写法
public class VolatileTest2 {
public volatile int inc = 0 ;
public void increase () {
inc++;
}
public static void main (String[] args) {
final VolatileTest2 test = new VolatileTest2();
final CountDownLatch latch = new CountDownLatch(1000 );
for (int i = 0 ; i < 1000 ; i++) {
new Thread(){
@Override
public void run () {
for (int j = 0 ; j < 10 ; j++) {
test.increase();
}
latch.countDown();
System.out .println("test.inc===============================" +test.inc);
}
}.start();
}
try {
latch.await ();
System.out .println(test.inc);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
使用join保证原子特性
public class VolatileTest1 {
public volatile int inc = 0 ;
public void increase () {
inc++;
}
public static void main (String[] args) {
final VolatileTest1 test = new VolatileTest1();
for (int i = 0 ; i < 1000 ; i++) {
System.out .println("i================================" +i);
Thread thread = new Thread(){
@Override
public void run () {
for (int j = 0 ; j < 10 ; j++) {
test.increase();
}
System.out .println("test.inc================================" +test.inc);
}
};
thread.start();
try {
thread.join ();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out .println(test.inc);
}
}