由此可以得知:
代码完成之后进行本地配置的一些读取操作:
至此可以得知其编译模式是mixed模式的
new date()默认输出的结果是import中包的默认构造函数初始化后的结果:
观看Date类源码即可得知:
鉴于java是单继承关系,由此来看一下import的传递过程,如下所示:
如下所示:
volatile运算;
/**
* volatile变量自增运算测试
* @author=hss
*/
public class Volatile {
public static volatile int race = 0;
public static void increase() {
race++;
}
private static final int THREADS_COUNRT = 20;
public static void main(String[] args) {
Thread[] threads = new Thread[THREADS_COUNRT];//发起了20个线程操作
for (int i = 0; i < THREADS_COUNRT; i++) { //遍历每个生成的线程操作
threads[i] = new Thread(new Runnable() { //对每一个线程执行runable接口的实例化的run()方法
@Override
public void run() {
for (int i = 0; i < 10000; i++) { //对于每一个单个线程执行1000次自增的操作
increase(); //调用increase()方法实现内部调用,也就是迭代
}
}
});
threads[i].start();//启动20个线程中的一个
System.out.println("这是第"+i+"线程");
}
//等待所有累加线程都结束
while(Thread.activeCount()>1)
Thread.yield();//yield是实现一个runable接口的方法
System.out.println(race);//最后输出race里面的自增的次数。
}
}
输出的结果如下:
"C:\Program Files\Java\jdk1.8.0_171\bin\java.exe" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:64780,suspend=y,server=n -javaagent:C:\Users\wu\.IntelliJIdea2018.2\system\captureAgent\debugger-agent.jar=file:/C:/Users/wu/AppData/Local/Temp/capture.props -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_171\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\rt.jar;C:\Users\wu\Desktop\work\11\vue\java_traing\out\production\java_traing;D:\IDEA_JAVA\IntelliJ IDEA 2018.2.4\lib\idea_rt.jar" Volatile
Connected to the target VM, address: '127.0.0.1:64780', transport: 'socket'
这是第0线程
这是第1线程
这是第2线程
这是第3线程
这是第4线程
这是第5线程
这是第6线程
这是第7线程
这是第8线程
这是第9线程
这是第10线程
这是第11线程
这是第12线程
这是第13线程
这是第14线程
这是第15线程
这是第16线程
这是第17线程
这是第18线程
这是第19线程
Disconnected from the target VM, address: '127.0.0.1:64780', transport: 'socket'
188320
Process finished with exit code 0
再一次输出结果如下:
"C:\Program Files\Java\jdk1.8.0_171\bin\java.exe" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:64956,suspend=y,server=n -javaagent:C:\Users\wu\.IntelliJIdea2018.2\system\captureAgent\debugger-agent.jar=file:/C:/Users/wu/AppData/Local/Temp/capture.props -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_171\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\rt.jar;C:\Users\wu\Desktop\work\11\vue\java_traing\out\production\java_traing;D:\IDEA_JAVA\IntelliJ IDEA 2018.2.4\lib\idea_rt.jar" Volatile
Connected to the target VM, address: '127.0.0.1:64956', transport: 'socket'
这是第0线程
这是第1线程
这是第2线程
这是第3线程
这是第4线程
这是第5线程
这是第6线程
这是第7线程
这是第8线程
这是第9线程
这是第10线程
这是第11线程
这是第12线程
这是第13线程
这是第14线程
这是第15线程
这是第16线程
这是第17线程
这是第18线程
这是第19线程
Disconnected from the target VM, address: '127.0.0.1:64956', transport: 'socket'
157513
Process finished with exit code 0
显示输出结果发生了变化从188320变成了157513
也就是代码片段的race的值:
按照代码逻辑的值,实际上是应该生成20(线程数目)*10000(i《10000,单个线程自增的次数)使用yield中的group进行线程集合统计:
正确并发结果,结果应该是200000才对,但是实际结果并不是这样:
1>不仅仅是不会等于200000,而且都是小于200000的。
当getstatic(初始化关键字)和new的作用是类似的,用于进行初始化操作的,
当gestatic指令把race的值取到操作栈顶时,volatile关键字保证了race在此时时正确的,
但是在执行iconst_1,iadd这些指令的时候,其他线程已经把race的值加大了,而在操作栈顶的值就变成了过期的数据,所以putstatic指令执行后就可能把较小的race值同步回主内存中了,导致
race的值总是小于200000
因此使用vlolatitle是不安全的。