`
dingjob
  • 浏览: 183248 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

JAVA基础特性-ThreadLocal 应用

阅读更多
   ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是thread local variable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适,他实现了线程的变量隔离,不同的线程可以维护自己的变量,
他在内部实现原理上比较简单,就是每个ThreadLocal内定义一个以自己线程名称为key的hashMap,在应用上非常广泛,struts2等框架的每一个Action请求都会被Web容器初始化为一个ActionContext。这样就实现了不同请求的隔离。
    下面看一个Demo,通过Demo的演示大概就可以看到 ThreadLocal的应用。


主程序:
   /**
 * @author job
 *
 */
public class ThreadLocalTest {

	
	public static void main(String[] args) {
		ExecutorService service = Executors.newFixedThreadPool(2);
		service.execute(new Runnable(){
			public void run() {
				Mydata.getMydata().setX(new Random().nextInt());
				A.say();
			}
		});
		service.execute(new Runnable(){
			public void run() {
				Mydata.getMydata().setX(new Random().nextInt());
				B.say();
			}
		});
		service.shutdown();
	}

}


用作共享的参数类:


/**
 * @author dingjob
 *
 */
 class Mydata {
		private static ThreadLocal data = new ThreadLocal();
		// 防止对象 被new,只能通过get的方法获得。
		private Mydata(){
		}
		int x;
		public static Mydata getMydata(){	
			Mydata mydata = (Mydata)data.get();
			if(mydata ==null){
				mydata = new Mydata();
				data.set(mydata);
			}
			return mydata;
		}
		public int getX() {
			return x;
		}

		public void setX(int x) {
			this.x = x;
		}	
}


两个简单的service

class A {
	public static void say(){
		System.out.println(Thread.currentThread().getName()+ Mydata.getMydata().getX());
	}
}

/**
 * @author dingjob
 *
 */
 class B {
	 public static void say(){
			System.out.println(Thread.currentThread().getName()+ Mydata.getMydata().getX());
		}
}





输出结果如下:
引用

62481336
pool-1-thread-1 62481336
-1790656022
pool-1-thread-2 -1790656022


通过以上代码大概可以看到,A,B 两个线程实现了隔离,A打印出来的就是A线程初始化
的值。


顺便说一下:
上面的例子也用了下自己不太熟悉的1.5的多线程处理类。
同时在Mydata的实现了良好的封装。



ThreadLocal 可以用于session等的保存,有很广泛的用途。
0
0
分享到:
评论

相关推荐

    Quartz-ThreadLocal.rar

    Quartz 是一个开源的作业调度框架,用于在 Java 应用程序中安排任务。它提供了丰富的 API 和灵活性,使得开发者可以方便地创建、管理和执行定时任务。ThreadLocal 是 Java 中的一个重要工具类,用于在多线程环境中为...

    Spring事务处理-ThreadLocal的使用

    在IT行业中,Spring框架是Java开发中的核心组件,尤其在企业级应用开发中扮演着重要角色。Spring事务处理是其核心特性之一,确保了数据的一致性和完整性。本篇文章将聚焦于Spring事务处理中ThreadLocal的使用,以及...

    java8-threadlocal

    Java 8 中的 ThreadLocal 是一个非常重要的工具类,它为每个线程提供了一个独立的变量副本,使得每个线程可以独立地改变自己的副本,而不会影响其他线程所对应的副本。这个特性在多线程编程中被广泛用于管理线程相关...

    Java-Interview-超全集合github上评分最高的jiva面试题

    通过学习和复习这些知识点,并结合"Java-Interview-超全集合github上评分最高的jiva面试题"中的题目进行实战演练,可以有效地提升Java开发者在面试中的竞争力,为成功获得理想职位打下坚实基础。在面试准备过程中,...

    Java面试突击-V3.0_Java面试文档_java面试_面试_

    这份文档详细涵盖了Java编程语言的各个方面,包括基础概念、进阶特性、并发处理、内存管理、垃圾收集、集合框架、IO流、网络编程、设计模式以及框架应用等核心知识点。以下是对这些关键领域的详细阐述: 1. **Java...

    java 简单的ThreadLocal示例

    Java中的ThreadLocal是一个非常重要的工具类,它在多线程编程中扮演着独特角色,尤其在处理线程间数据隔离和共享时。ThreadLocal不是线程本身,而是为每个线程提供一个独立的变量副本,使得每个线程都可以独立地改变...

    java资料---Java SE.ppt

    在Java的面向对象基础中,封装、继承和多态是三大核心概念。封装允许隐藏内部实现细节,提高代码安全性;继承使子类能够继承父类的属性和方法,实现代码重用;多态则允许使用父类引用指向子类对象,增强了程序的灵活...

    入研究java.lang.ThreadLocal类.docx

    ### 知识点详解:Java.lang.ThreadLocal 类 #### 一、概述 **ThreadLocal** 并非线程的一种特殊实现形式,而是一种为每个线程提供独立副本的机制,通常被称为“线程局部变量”。这种机制使得每个线程都可以独立...

    Java-learning-experience.zip_experience

    首先,Java的基础知识是学习的起点,包括了解Java语言的历史、应用领域以及其与C++和C#等其他语言的区别。Java以其跨平台的特性、“一次编写,到处运行”(Write Once, Run Anywhere, WORA)的理念,吸引了大量的...

    JAVA程序设计------

    对于初学者来说,学习Java编程语言是一个很好的起点,因为它的语法清晰,具有丰富的库支持,并且广泛应用于各种领域,包括企业级应用、安卓开发和大数据处理。以下是对给定文件中各章节内容的详细解释: 1. **第一...

    java面试题--java面试题

    Java面试题是每个Java开发者在求职过程中必须面对的挑战,这些题目涵盖了广泛的Java知识领域,包括基础语法、面向对象编程、集合框架、多线程、异常处理、内存管理、JVM、网络编程、设计模式等。下面将针对这些重要...

    JAVA核心技术--高级特征(第八版)--第四部分

    《JAVA核心技术--高级特征(第八版)--第四部分》聚焦于Java编程语言的高级特性,这部分内容通常涉及到更复杂的编程概念和技术,是Java开发者进阶学习的重要篇章。在这一部分中,我们可以期待涵盖以下核心知识点: 1....

    基于Java的源码-超简单Java多线程填表源码.zip

    在Java编程语言中,多线程是核心特性之一,它允许程序同时执行多个任务,从而提高了应用程序的效率和响应速度。这个"基于Java的源码-超简单Java多线程填表源码.zip"文件很可能包含一个简单的示例,演示如何在Java中...

    Java并发编程-线程安全与基础构建模块

    在Java编程领域,多线程并发是不可或缺的一部分,特别是在服务器端和高并发应用中。本文将深入探讨"Java并发编程-线程安全与基础构建模块"这一主题,旨在帮助开发者理解如何有效地处理并发问题,提高程序性能和稳定...

    Java-multi-threads-programming.rar_java programming

    Java多线程编程是Java编程领域中的一个重要主题,它允许程序同时执行多个任务,从而提高应用程序的效率和响应性。...通过深入学习和实践,开发者可以充分利用Java的多线程特性,构建高效、稳定的应用程序。

    java笔试题库-选择题.rar

    这份“java笔试题库-选择题.rar”包含了针对Java程序员笔试的精选题目,旨在帮助备考者提升对Java语言的理解和应用能力。每个文本文件(1-70.txt、71-140.txt、141-210.txt)可能代表了一个问题集,涵盖了不同的知识...

    java面试基础

    在准备Java面试时,了解基础概念和技术细节至...总的来说,Java面试基础涵盖了广泛的领域,从语言基础到高级特性,再到工具使用和实战经验,都需要扎实的掌握。通过不断学习和实践,才能在面试中展现出自己的专业素养。

Global site tag (gtag.js) - Google Analytics