Java线(一个):线程安全的和不安全
当我们看JDK API什么时候,总是找一些类描述说:,线程安全或线程安全,例如StringBuilder在,么一句,“将StringBuilder
的实例用于多个线程是不安全的。假设须要这种同步,则建议使用StringBuffer
。
”,那么以下手动创建一个线程不安全的类,然后在多线程中使用这个类,看看有什么效果。
Count.java:
- public class Count {
- private int num;
- public void count() {
- for(int i = 1; i <= 10; i++) {
- num += i;
- }
- System.out.println(Thread.currentThread().getName() + "-" + num);
- }
- }
在这个类中的count方法是计算1一直加到10的和,并输出当前线程名和总和。我们期望的是每一个线程都会输出55。
ThreadTest.java:
- public class ThreadTest {
- public static void main(String[] args) {
- Runnable runnable = new Runnable() {
- Count count = new Count();
- public void run() {
- count.count();
- }
- };
- for(int i = 0; i < 10; i++) {
- new Thread(runnable).start();
- }
- }
- }
这里启动了10个线程,看一下输出结果:
- Thread-0-55
- Thread-1-110
- Thread-2-165
- Thread-4-220
- Thread-5-275
- Thread-6-330
- Thread-3-385
- Thread-7-440
- Thread-8-495
- Thread-9-550
仅仅有Thread-0线程输出的结果是我们期望的。而输出的是每次都累加的,这里累加的原因以后的博文会说明。那么要想得到我们期望的结果,有几种解决方式:
1. 将Count中num变成count方法的局部变量;
- public class Count {
- public void count() {
- int num = 0;
- for(int i = 1; i <= 10; i++) {
- num += i;
- }
- System.out.println(Thread.currentThread().getName() + "-" + num);
- }
- }
2. 将线程类成员变量拿到run方法中,这时count引用是线程内的局部变量;
- public class ThreadTest4 {
- public static void main(String[] args) {
- Runnable runnable = new Runnable() {
- public void run() {
- Count count = new Count();
- count.count();
- }
- };
- for(int i = 0; i < 10; i++) {
- new Thread(runnable).start();
- }
- }
- }
3. 每次启动一个线程使用不同的线程类,不推荐。
上述測试,我们发现。存在成员变量的类用于多线程时是不安全的,不安全体如今这个成员变量可能发生非原子性的操作,而变量定义在方法内也就是局部变量是线程安全的。想想在使用struts1时。不推荐创建成员变量,由于action是单例的,假设创建了成员变量。就会存在线程不安全的隐患,而struts2是每一次请求都会创建一个action。就不用考虑线程安全的问题。
所以,日常开发,一般来说,我们需要考虑在多线程环境中的成员变量和全局变量,是否会导致一些问题。
版权声明:本文博客原创文章,博客,未经同意,不得转载。
Java线(一个):线程安全的和不安全的更多相关文章
- JAVA - 启动一个线程是用run()还是start()?
JAVA - 启动一个线程是用run()还是start()? 启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行.这并不意味着线程就会立即运 ...
- 用 Java 写一个线程安全的单例模式(Singleton)?
请参考答案中的示例代码,这里面一步一步教你创建一个线程安全的 Java 单例类.当我们说线程安全时,意思是即使初始化是在多线程环境中,仍然能保证单个实例.Java 中,使用枚举作为单例类是最简单的方式 ...
- java 添加一个线程、创建响应的用户界面 。 演示示例代码
javajava 添加一个线程.创建响应的用户界面 . 演示示例代码 来自thinking in java 4 21章 部分的代码 夹21.2.11 thinking in java 4免费下载: ...
- Java中一个线程只有六个状态。至于阻塞、可运行、挂起状态都是人们为了便于理解,自己加上去的。
java中,线程的状态使用一个枚举类型来描述的.这个枚举一共有6个值: NEW(新建).RUNNABLE(运行).BLOCKED(锁池).TIMED_WAITING(定时等待).WAITING(等待) ...
- java停止一个线程
Thread类中有start(), stop()方法,不过stop方法已经被废弃掉. 平时其实也有用过,共享一个变量,相当于标志,不断检查标志,判断是否退出线程 如果有阻塞,需要使用Thread的in ...
- Java里一个线程两次调用start()方法会出现什么情况
Java的线程是不允许启动两次的,第二次调用必然会抛出IllegalThreadStateException,这是一种运行时异常,多次调用start被认为是编程错误. 如果业务需要线程run中的代码再 ...
- Java自学-多线程 启动一个线程
Java 创建一个线程的三种方式 多线程即在同一时间,可以做多件事情. 创建多线程有3种方式,分别是继承线程类,实现Runnable接口,匿名类 步骤 1 : 线程概念 首先要理解进程(Process ...
- 线程池如何复用一个线程-- ThreadPoolExecutor的实现(未完)
任务是一组逻辑工作单元,而线程则是使任务异步执行的机制.在Java中,Runnable对象代表一个任务,Thread对象负责创建一个线程执行这个任务. 前提:1. 程序需要处理大量任务 2. 任务的执 ...
- java多线程之:创建开启一个线程的开销
---->关于时间,创建线程使用是直接向系统申请资源的,这里调用系统函数进行分配资源的话耗时不好说.---->关于资源,Java线程的线程栈所占用的内存是在Java堆外的,所以是不受jav ...
随机推荐
- Java的JXL操作xls形式
jxl这是一个韩国的写作java操作excel工具, 源世界中,有两套比較有影响的API可供使用.一个是POI,一个是jExcelAPI.当中功能相对POI比較弱一点.但jExcelAPI对中文支持非 ...
- Kdd Cup 2013 总结2
- 求1e11以内的素数
有两种做法,一种是打表,另一种是直接求. 打表 将1e11每隔len(len=2000w)个数字统计一下该区间内素数的个数,比如cnt[1] 表示[1,len]以内有多少个素数,cnt[2]表示[le ...
- Cantor的数表 【找规律】
小俞同学,近期勤学苦练数学,对一种数表产生了兴趣. 数表例如以下: 1/1 1/2 1/3 1/4 1/5 2/1 2/2 2/3 2/4 3/1 3/2 3/3 4/1 4/2 5/1 她冥思苦相了 ...
- hdu4635(最多加多少边,使得有向图不是强连通图)
连边的最后肯定是两个集合x,yx集合的每个元素,到y集合中的每个元素都是单向的边x集合,和y集合都是完全图设a为x集合的点的个数, b为y集合的那么答案就是 a * b + a*(a-1) + b*( ...
- OpenCV, color reduction method
转载请注明出处!!!http://blog.csdn.net/zhonghuan1992 OpenCV, colorreduction method 目标: 这次学习的目标是回答以下的几个问题: 1 ...
- Custom Media Player in WPF (Part 1)
First of all I would like to welcome everyone to my new blog and wish you all a happy new year… Thro ...
- Windows Phone开发(18):变形金刚第九季——变换
原文:Windows Phone开发(18):变形金刚第九季--变换 变换不是一个好理解的概念,不是吓你,它涉及很多有关代数,几何,以及线性代数的知识.怎么?被我的话吓怕了?不用怕,尽管我们未必能够理 ...
- Spring官方网站的改版后下载
Spring官方网站改版很长一段时间后还没有找到直接下载Jar链接包,下面总结了一些方法,可在网上,亲測可用. 1.直接输入地址,改对应版本号就可以:http://repo.springsource. ...
- JDK源码学习系列05----LinkedList
JDK源码学习系列05----LinkedList 1.LinkedList简介 LinkedList是基于双向链表实 ...