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这个关键字到底应该用在哪里了~~
这真是个纠结的问题,回去查下资料,各位大神也可以帮下忙
java 线程基础学习的更多相关文章
- Java线程池学习
Java线程池学习 Executor框架简介 在Java 5之后,并发编程引入了一堆新的启动.调度和管理线程的API.Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java ...
- Java【基础学习】之暴力求素数【用数组返回】
Java[基础学习]之暴力求素数[用数组返回] */ import java.util.*; public class Main{ public static void main(String[] a ...
- Java 线程基础
Java 线程基础
- Java基础学习总结(94)——Java线程再学习
Java线程有哪些不太为人所知的技巧与用法? 萝卜白菜各有所爱.像我就喜欢Java.学无止境,这也是我喜欢它的一个原因.日常工作中你所用到的工具,通常都有些你从来没有了解过的东西,比方说某个方法或者是 ...
- Java线程机制学习
前面的文章中总结过Java中用来解决共享资源竞争导致线程不安全的几种常用方式: synchronized: ReentrantLock: ThreadLocal: 这些都是在简单介绍了基本用法的基础上 ...
- java线程基础知识----线程与锁
我们上一章已经谈到java线程的基础知识,我们学习了Thread的基础知识,今天我们开始学习java线程和锁. 1. 首先我们应该了解一下Object类的一些性质以其方法,首先我们知道Object类的 ...
- java线程基础知识----线程基础知识
不知道从什么时候开始,学习知识变成了一个短期记忆的过程,总是容易忘记自己当初学懂的知识(fuck!),不知道是自己没有经常使用还是当初理解的不够深入.今天准备再对java的线程进行一下系统的学习,希望 ...
- java线程基础巩固---线程生命周期以及start方法源码剖析
上篇中介绍了如何启动一个线程,通过调用start()方法才能创建并使用新线程,并且这个start()是非阻塞的,调用之后立马就返回的,实际上它是线程生命周期环节中的一种,所以这里阐述一下线程的一个完整 ...
- Java 线程基础知识
前言 什么是线程?线程,有时被称为轻量进程(Lightweight Process,LWP),是程序执行流的最小单元.一个标准的线程由线程 ID,当前指令指针 (PC),寄存器集合和堆栈组成.另外,线 ...
随机推荐
- xx-net***简明使用教程
简介 继psiphon3.lantern.shadowsocks后,翻 土啬 界就来个新角色:xx-net 这张图是.2016.8.30日Google最新的搜索结果,还是可以看出这款工具的火爆程度的, ...
- python3爬虫全国地址信息
PHP方式写的一团糟所以就用python3重写了一遍,所以因为第二次写了,思路也更清晰了些. 提醒:可能会有502的错误,所以做了异常以及数据库事务处理,暂时没有想到更好的优化方法,所以就先这样吧.待 ...
- nginx反向代理服务器端口问题
nginx可以很方便的配置成反向代理服务器 server { listen 80; server_name bothlog.com; location / { proxy_set_header H ...
- no matching key exchange method found. Their offer: diffie-hellman-group1-sha1
1. 使用git克隆项目报错 $ git clone ssh://liuchao@192.168.7.32:29418/platform/Midou Cloning into 'Midou'... U ...
- Aggregate Services
https://stackoverflow.com/questions/7199097/constructor-injection-into-a-base-class-using-autofac Ca ...
- JavaScript中this关键字的使用比较
JavaScript中this关键字的使用比较 this关键字在JavaScript中,用的不能说比较多,而是非常多.那么熟悉this关键字的各种用法则显得非常关键. this有时候就是我们经常说的上 ...
- 用Java编程计算猴子吃桃问题
猴子吃桃问题:猴子吃桃子问题:猴子第一天摘下N个桃子,当时就吃了一半,还不过瘾,就又吃了一个.第二天又将剩下的桃子吃掉一半,又多吃了一个.以后每天都吃前一天剩下的一半零一个.到第10天在想吃的时候就剩 ...
- 在OpenStack里怎样配置Neutron,让虚拟机访问外网
http://blog.csdn.net/zhangli_perdue/article/details/50264681 OpenStack里虚机(或者叫instance)只有在分配floating ...
- BZOJ 1835 [ZJOI2010]base 基站选址:线段树优化dp
传送门 题意 有 $ n $ 个村庄在一排直线上,现在要建造不超过 $ K $ 个通讯基站,基站只能造在村庄处. 第 $ i $ 个村庄距离第 $ 1 $ 个村庄的距离为 $ D_i $ .在此建造基 ...
- CSS3 content属性学习
css3中出现了 ":before",":after"伪类, 你可以这样写: h1:after{ content:'h1后插入的文本'; ... } 这两个选择 ...