当我们看JDK API什么时候,总是找一些类描述说:,线程安全或线程安全,例如StringBuilder在,么一句,“将StringBuilder 的实例用于多个线程是不安全的。假设须要这种同步,则建议使用StringBuffer
”,那么以下手动创建一个线程不安全的类,然后在多线程中使用这个类,看看有什么效果。

Count.java:

[java] view
plain
copy

  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
plain
copy

  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
plain
copy

  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
plain
copy

  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
plain
copy

  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。就不用考虑线程安全的问题。

所以,日常开发,一般来说,我们需要考虑在多线程环境中的成员变量和全局变量,是否会导致一些问题。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

最新文章

  1. 如何定义好一个符合规范的url
  2. Android Material Design 兼容库的使用
  3. t4 加载文件到解决方案
  4. ios中UIButton选中状态切换
  5. Flexbox盒子弹性布局
  6. cenos 7 安装php7
  7. SQL入门学习3-数据更新
  8. Brackets--我的初恋编辑器
  9. wget下载整个网站
  10. HTML5本地存储应用sessionStorage和localStorage
  11. SSM-Spring-04:Spring的DI的构造注入,P命名注入,和集合注入
  12. 【XSY3370】道路建设 最短路
  13. python3安装pycurl
  14. 下面哪些是无效的Java标识?为什么?
  15. 【金三银四跳槽季】Java工程师如何在1个月内做好面试准备?
  16. 第一次java测试有感
  17. Ubuntu x86-64汇编(1)
  18. CentOS 开启防火墙 firewall ,mysql 远程访问
  19. vue数据双向绑定原理
  20. Nginx Location模块

热门文章

  1. 《Linux命令行与shell脚本编程大全》 第十六章 学习笔记
  2. MongoDB--Getting Started with Java Driver
  3. win7下硬盘安装win7+linuxUbuntu双系统方法
  4. LAMP配置参考地址
  5. Exec l 中分列的作用
  6. aStar算法求第k短路
  7. ASP.NET 应用程序生命周期
  8. [WebView五学习]:调试Web Apps
  9. shell split分析日志文件
  10. 开源Math.NET基础数学类库使用(17)C#计算矩阵条件数