出处:http://blog.csdn.net/ghsau/article/details/7421217

Java线程(一):线程安全与不安全

标签: 线程安全多线程
2012-04-02 12:13 67298人阅读 评论(83) 收藏 举报
 分类:
Java 线程(13)  Java SE(40) 

版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/ghsau。

作为一个Java web开发人员,很少也不需要去处理线程,因为服务器已经帮我们处理好了。记得大一刚学Java的时候,老师带着我们做了一个局域网聊天室,用到了AWT、Socket、多线程、I/O,编写的客户端和服务器,当时做出来很兴奋,回学校给同学们演示,感觉自己好NB,呵呵,扯远了。上次在百度开发者大会上看到一个提示语,自己写的代码,6个月不看也是别人的代码,自己学的知识也同样如此,学完的知识如果不使用或者不常常回顾,那么还不是自己的知识。大学零零散散搞了不到四年的Java,我相信很多人都跟我一样,JavaSE基础没打牢,就急忙忙、兴冲冲的搞JavaEE了,然后学习一下前台开发(html、css、JavaScript),有可能还搞搞jQuery、extjs,再然后是Struts、hibernate、spring,然后听说找工作得会Linux、Oracle,又去学,在这个过程中,是否迷失了,虽然学习面很广,但就像《神雕侠侣》中黄药师评价杨过,博而不精、杂而不纯,这一串下来,感觉做Java开发好难,并不是学着难,而是知识面太广了,又要精通这个,又要精通那个,这只是我迷茫时候的想法,现在我已经找到方向了。

回归正题,当我们查看JDK API的时候,总会发现一些类说明写着,线程安全或者线程不安全,比如说StringBuilder中,有这么一句,“将StringBuilder 的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用StringBuffer。 ”,那么下面手动创建一个线程不安全的类,然后在多线程中使用这个类,看看有什么效果。

Count.java:

[java] view plaincopy print?
  1. public class Count {
  2. private int num;
  3. public void count() {
  4. for(int i = 1; i <= 10; i++) {
  5. num += i;
  6. }
  7. System.out.println(Thread.currentThread().getName() + "-" + num);
  8. }
  9. }

在这个类中的count方法是计算1一直加到10的和,并输出当前线程名和总和,我们期望的是每个线程都会输出55。

ThreadTest.java:

[java] view plaincopy print?
  1. public class ThreadTest {
  2. public static void main(String[] args) {
  3. Runnable runnable = new Runnable() {
  4. Count count = new Count();
  5. public void run() {
  6. count.count();
  7. }
  8. };
  9. for(int i = 0; i < 10; i++) {
  10. new Thread(runnable).start();
  11. }
  12. }
  13. }

这里启动了10个线程,看一下输出结果:

[java] view plaincopy print?
  1. Thread-0-55
  2. Thread-1-110
  3. Thread-2-165
  4. Thread-4-220
  5. Thread-5-275
  6. Thread-6-330
  7. Thread-3-385
  8. Thread-7-440
  9. Thread-8-495
  10. Thread-9-550

只有Thread-0线程输出的结果是我们期望的,而输出的是每次都累加的,这里累加的原因以后的博文会说明,那么要想得到我们期望的结果,有几种解决方案:

1. 将Count中num变成count方法的局部变量;

[java] view plaincopy print?
  1. public class Count {
  2. public void count() {
  3. int num = 0;
  4. for(int i = 1; i <= 10; i++) {
  5. num += i;
  6. }
  7. System.out.println(Thread.currentThread().getName() + "-" + num);
  8. }
  9. }

2. 将线程类成员变量拿到run方法中,这时count引用是线程内的局部变量;

[java] view plaincopy print?
  1. public class ThreadTest4 {
  2. public static void main(String[] args) {
  3. Runnable runnable = new Runnable() {
  4. public void run() {
  5. Count count = new Count();
  6. count.count();
  7. }
  8. };
  9. for(int i = 0; i < 10; i++) {
  10. new Thread(runnable).start();
  11. }
  12. }
  13. }

3. 每次启动一个线程使用不同的线程类,不推荐。
        上述测试,我们发现,存在成员变量的类用于多线程时是不安全的,不安全体现在这个成员变量可能发生非原子性的操作,而变量定义在方法内也就是局部变量是线程安全的。想想在使用struts1时,不推荐创建成员变量,因为action是单例的,如果创建了成员变量,就会存在线程不安全的隐患,而struts2是每一次请求都会创建一个action,就不用考虑线程安全的问题。所以,日常开发中,通常需要考虑成员变量或者说全局变量在多线程环境下,是否会引发一些问题。

本文来自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/7421217,转载请注明。

java多线程---比较全的相关推荐

  1. Java多线程(全)学习笔记(上)

    2019独角兽企业重金招聘Python工程师标准>>> 一.线程的创建和启动 java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例.每条线程的作用是 ...

  2. Java多线程-将全量用户表70万数据压缩并生成CSV文件和推送到FTP上(最快快方式)

    需求来源 我们系统作为组织用户的数据源, 很多下级单位系统需要不定时的获取用户全量表的数据,因为安全的原因我们不提对外接口,而是将数据读取出来并生成csv文件,然后进行压缩为gz文件之后, 放在他们指 ...

  3. 史上最全 Java 多线程面试题及答案

    这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题. 这些多线程的问题,有些来源于各大网站.有些来源于自己的思考.可能有些问题网上有.可能有些问题对应的答案也有.也可能有些各位网友也 ...

  4. 史上最全 Java 多线程面试题及答案 1

    这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题. 这些多线程的问题,有些来源于各大网站.有些来源于自己的思考.可能有些问题网上有.可能有些问题对应的答案也有.也可能有些各位网友也 ...

  5. 史上最全Java多线程面试题及答案

    这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题. 这些多线程的问题,有些来源于各大网站.有些来源于自己的思考.可能有些问题网上有.可能有些问题对应的答案也有.也可能有些各位网友也 ...

  6. 史上最全Java多线程面试题

    转载自 史上最全Java多线程面试题及答案 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域.所以,学好多线程并发编程对Java程序员来来说极其重要的. 下面小编整理了60道最常见的 ...

  7. 史上最全Java多线程面试60题,含答案大赠送!

    [BAT必考系列!多线程60题] 多线程有什么用? 线程和进程的区别是什么? ava实现线程有哪几种方式? 启动线程方法start()和run()有什么区别? 怎么终止一个线程?如何优雅地终止线程? ...

  8. Java多线程系列(一):最全面的Java多线程学习概述

    Java并发编程的技能基本涵括以下5方面: 多线程 线程池 线程锁 并发工具类 并发容器 多线程的4种创建方式 继承Thread 实现Runnable接口 实现Callable接口 以及线程池来创建线 ...

  9. 耀世升级发布!阿里第三版Java多线程核心技术手册PDF全彩版

    篇将会带着大家去全面剖析多线程编程的核心库.方法.原理,利用案例方式,透彻讲解高并发本质与应对方法!同时这份PDF全部以Demo式案例来讲解技术点的实现,使读者看到代码及 运行结果后就可以知道该项目要 ...

最新文章

  1. 一对一直播app源码功能操详解方案分享
  2. Oracle数据库日常维护
  3. Webservices
  4. VBS 连接数据库 - 样例
  5. 如何给5岁孩子解释DCT?
  6. gitbook 入门教程之解决windows热加载失败问题
  7. 高等数学上-赵立军-北京大学出版社-题解-练习2.6
  8. mysql timeout的单位_mysql的timeout-阿里云开发者社区
  9. 在Saas发展的黄金时代里带你理解SaaS设计
  10. 云和恩墨:2020是国产数据库崛起的发轫之年
  11. ubuntu查看cuda和cudnn
  12. 小学计算机期末评价方案,小学班级管理评价方案
  13. 计算机专业论文摘要,★计算机专业概论论文摘要范文计算机专业概论论文摘要写(8页)-原创力文档...
  14. 高密集型工业体系步履蹒跚
  15. 小程序--微信拼团设计实现
  16. 每日一犬 · 波尔多犬
  17. Interval (mathematics)
  18. libnet介绍与分析
  19. 服务器不能用pe安装win7系统安装,PE安装win7系统失败的完美解决方案
  20. 6阶群的非平凡子群_简明算术教程——第二章 群——第9节 可解群

热门文章

  1. ActiveMQ的network connectors部署集群(七)
  2. 【双100%提交】剑指 Offer 09. 用两个栈实现队列
  3. linux-RPM与YUM
  4. 怎么获取web开发怎么获取手机的唯一标识_PYTHON实现北京住宅小区数据抓取-(Web服务API-地点检索服务)
  5. java修车_JAVA小练习34——使用java描述一个车类与一个修车厂类
  6. java库存导出_java生成导出excle文件
  7. python调用函数示例_python 动态调用函数实例解析
  8. html用bmob做留言,bmob js-sdk 在vue中的使用教程
  9. java url 处理,URL处理-Java架构师必看
  10. python求pai的近似值_PR Sampling Ⅰ: 蒙特卡洛采样、重要性采样及python实现