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