技术:java8内存模型 demo
运行环境:IDEA 15.2 + jdk8 + windows 7
demo功能:提供一个验证 volatile不是线程安全的代码demo 和 怎么使用才能线程安全的demo
volatile使用基本demo: http://demoworld.tech/c/java_volatile_demo1
public static volatile int n = 0;
public static void increase() {
n++;
}
//这个测试用例,总共是20个线程, 每个限制都加加 10000 次, 最后的结果理论上是 20*10000=200,000
//但是实际上, 每次的结果都小于理论值。
@Test
public void testNotThreadSafe() throws InterruptedException {
Thread[] tmpThreads = new Thread[20];
for (int i = 0; i <= tmpThreads.length - 1; i++) {
tmpThreads[i] = new Thread(new Runnable() {
@Override
public void run() {
for (int j = 0; j < 10000; j++) {
increase();
}
System.out.println("Over.");
}
});
tmpThreads[i].start();
}
Thread.sleep(2000);
System.out.println(n);//最后的结果理论上是 20*10000=200,000,
}
public static volatile int n = 0;
public synchronized static void increase1() {
n++;
}
//这个测试用例,总共是20个线程, 每个限制都加加 10000 次, 最后的结果理论上是 20*10000=200,000
//但是实际上, 每次的结果都小于理论值。
@Test
public void testNotThreadSafe1() throws InterruptedException {
Thread[] tmpThreads = new Thread[20];
for (int i = 0; i <= tmpThreads.length - 1; i++) {
tmpThreads[i] = new Thread(new Runnable() {
@Override
public void run() {
for (int j = 0; j < 10000; j++) {
increase1();
}
System.out.println("Over.");
}
});
tmpThreads[i].start();
}
Thread.sleep(2000);
System.out.println(n);//最后的结果理论上是 20*10000=200,000,
}
想要了解原因, 请查看源代码注释
欢迎添加微信,互相学习↑↑↑ -_-
白老虎
programming is not only to solve problems, ways to think
grafana 级连 菜单 templating (variables) 配置
rocketmq 集群搭建 (2master + 2slave + 2namesrv)
AI 机器人 抓取 微信 聊天中的 百度网盘 分享地址和密码