码迷,mamicode.com
首页 > 编程语言 > 详细

Java并发编程--线程局部变量使用

时间:2015-05-28 09:32:01      阅读:292      评论:0      收藏:0      [点我收藏+]

标签:

       共享数据是并发程序最核心的问题之一。下面我们看一个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;
	
	@Override
	public 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());
		}
		
	};
	@Override
	public 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的局部变量。


Java并发编程--线程局部变量使用

标签:

原文地址:http://blog.csdn.net/kanglix1an/article/details/46008907

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!