zoukankan      html  css  js  c++  java
  • java 线程基础学习

    今天趁空闲时间看了点线程方面的知识

    首先看的是volatile关键字,按照我之前书上看到的一点知识,自己的理解是,volatile关键字会阻止编译优化,因为cpu每次读取数据是并不是从高速缓存中读取,而是取内存中的数据。这是自己的一点简单的理解,可能有错误。我之前只是看了点线程方面的知识,只是在自己写代码的时候很少(根本没用到),就是自己学习的时候跟着书上敲了代码。

    实习的时候要我写个压力测试,1000个线程同时发请求,统计请求失败的次数,我用了volatile关键字,但是感觉有点问题,今天就测试了下。

    我之前一直认为,用volatile关键字强调的变量在 多线程的自增是不会出现问题的

    下面是我的第一次测试代码

    import java.util.ArrayList;
    import java.util.List;
    
    public class Count {
    
        private static volatile int count = 0;
    
        public static void inc() {
            count++;
        }
    
        public static int getCount() {
            return count;
        }
    
        public static void main(String[] args) throws Exception {
            List<Thread> list = new ArrayList<Thread>(100);
            for (int i = 0; i < 100; i++) {
                list.add(new Thread(new Runnable() {
                    @Override
                    public void run() {
                        // for(int i=0;i<100;i++){
                        Count.inc();
                        // }
                    }
                }));
            }
    
            for (Thread t : list) {
                t.start();
            }
    
            for (Thread t : list) {
                t.join();
            }
    
            System.out.println("-----end-----");
            System.out.println(Count.getCount());
    
        }
    
    }

    我测试了很多次,最后的结果确实是100,让我差点都以为上面的结论是正确的

    但是我从一本书上看到。在run方法里面再套个循环,就是把上面的注释取消掉会出现问题

    现在才进行测试,结果确实出现问题了,预期结果是10000,但是测试结果总是9800+,9900+,就是到不了10000.

    但是有注释和没注释,这段代码有区别吗?我想了半天这段代码的区别,觉得可能是每个线程运行的时间太短了,导致出现了预期的结果

    继续测试,还是加上注释,将100次循环改为1000次,测试结果为999。

    这下终于推翻了  用volatile关键字强调的变量在 多线程的自增是不会出现问题的  这个结论。

    但是得到这个结论的同时,我不知道volatile这个关键字到底应该用在哪里了~~

    这真是个纠结的问题,回去查下资料,各位大神也可以帮下忙

  • 相关阅读:
    [ html canvas getImageData Object.data.length ] canvas绘图属性 getImageData Object.data.length 属性讲解
    [ html canvas 模仿支付宝刮刮卡效果 ] canvas绘图属性 模仿支付宝刮刮卡效果实例演示
    [ javascript html Dom image 对象事件加载方式 ] 对象事件加载方式
    [ javascript New Image() ] New Image() 对象讲解
    Django安装及环境配置
    python使用opencv实现人脸识别系统
    redis 操作常用命令
    关于Python获取SQLSERVER数据库中文显示乱码问题
    Topshelf创建windows服务初探
    Js获取ip地址
  • 原文地址:https://www.cnblogs.com/luolei/p/4718832.html
Copyright © 2011-2022 走看看