Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性
程序员文章站
2022-05-28 17:12:41
...
- 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);
}
}
下一篇: 日志拦截器