Java并发编程--线程局部变量使用
来源:互联网 发布:怎么把产品放到淘宝上 编辑:程序博客网 时间:2024/04/19 07:08
共享数据是并发程序最核心的问题之一。下面我们看一个Deom感受一下多线程对属性的影响。
代码:
UnsafeTask.java
package com.tgb.klx.thread;import java.text.SimpleDateFormat;import java.util.Date;import java.util.concurrent.TimeUnit;public class UnsafeTask implements Runnable {private String startDate;@Overridepublic void run() {SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");startDate=sdf.format( new Date());System.out.println("开始线程:"+Thread.currentThread().getId()+",开始的时间:"+startDate);try {TimeUnit.SECONDS.sleep((int)Math.rint(Math.random()*10));} catch (InterruptedException e) {e.printStackTrace();}System.out.println("结束线程:"+Thread.currentThread().getId()+",开始的时间:"+startDate);}}
Core.java
package com.tgb.klx.thread;import java.util.concurrent.TimeUnit;public class Core {public static void main(String[] args) {UnsafeTask task=new UnsafeTask();for(int i=0;i<10;i++){Thread thread=new Thread(task);thread.start();try {TimeUnit.SECONDS.sleep(2);} catch (InterruptedException e) {e.printStackTrace();}}}}
运行结果:
可以看到,最后一个线程开始的时间,是剩余线程结束的时间,明显的一个线程启动的时间被其他线程修改了。
那么,我们通过什么方式能保证一个线程的局部变量不会被其他线程修改呢?下面我们使用ThreadLocal,来保护相线程的属性不被其他线程修改:
代码:
SafeTask.java
package com.tgb.klx.thread;import java.text.SimpleDateFormat;import java.util.Date;import java.util.concurrent.TimeUnit;public class SafeTask implements Runnable {private static ThreadLocal<String> startDate=new ThreadLocal<String>(){protected String initialValue(){SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");return sdf.format( new Date());}};@Overridepublic void run() {System.out.println("开始线程:"+Thread.currentThread().getId()+",开始的时间:"+startDate.get());try {TimeUnit.SECONDS.sleep((int)Math.rint(Math.random()*10));} catch (InterruptedException e) {e.printStackTrace();}System.out.println("结束线程:"+Thread.currentThread().getId()+",开始的时间:"+startDate.get());}}
运行结果:
我们保证了线程内的局部变量的安全性。ThreadLocal是JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序,ThreadLocal并不是一个Thread,而是Thread的局部变量。
0 0
- Java并发编程--线程局部变量使用
- 并发编程--线程局部变量的使用
- Java并发编程-04-线程局部变量
- Java并发编程-线程局部变量(ThreadLocal)
- Java并发编程:线程池的使用
- Java并发编程:线程池的使用
- Java并发编程:线程池的使用
- Java并发编程:线程池的使用
- Java并发编程:线程池的使用
- Java并发编程:线程池的使用
- Java并发编程:线程池的使用
- Java并发编程:线程池的使用
- Java并发编程:线程池的使用
- Java并发编程:线程池的使用
- Java并发编程:线程池的使用
- Java并发编程:线程池的使用
- Java并发编程:线程池的使用
- Java并发编程:线程池的使用
- 海量数据处理---分布式处理之MapReduce
- Android系统属性分析ro.persist.
- 关于NS2的安装
- 每天一道算法题(9)——在二元树中找出和为某一值的所有路径
- Java swing入门教程(转载)
- Java并发编程--线程局部变量使用
- 大数据技术-HBase:HBase 日志划分详解
- C#双缓冲
- 数据结构运动会分数统计实习报告源码
- python程序获取当前行号和文件名
- android背景选择器selector用法汇总
- Thinking in Java---多态初探
- Struts2.3.24 配置问题
- c# winform 打包部署 自定义界面 或设置开机启动