1.java一切即对象以及java内存模型与线程

由此可以得知:

代码完成之后进行本地配置的一些读取操作:

至此可以得知其编译模式是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是不安全的。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值