`
aty
  • 浏览: 36521 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JDK的ThreadLocal理解(一)使用和测试

阅读更多

       ThreadLocal是java中轻量级的线程同步解决方法,为了达到线程安全的目的,采用的是空间隔离的方法。使用方式如下:

 

1、定义2个会被多线程共享的bean,一个使用ThreadLocal,一个不使用任何线程同步措施

package bean;

public interface IShareBean 
{
    public void get();
	
    public void autoInc();
}

package bean.impl;

import bean.IShareBean;

public class SafeShareBeanImpl implements IShareBean
{
	// 创建一个线程局部变量并赋初值
	// 该变量是被所有访问SafeShareBeanImpl类的线程共享的,但不存在线程安全问题
	private static ThreadLocal<Integer> localCount = new ThreadLocal<Integer>()
	{
		protected Integer initialValue() 
		{
			return 0;
		};
	};

	public void get() 
	{
		System.out.println(Thread.currentThread().getName()
				+ ",after increment:" + localCount.get());
	}

	public void autoInc() 
	{
		int count = localCount.get();
		
		System.out.println(Thread.currentThread().getName()
				+ ",before increment:" + count);
		
		count++;
		
		localCount.set(count);
	}

}

package bean.impl;

import bean.IShareBean;

public class UnSafeShareBeanImpl implements IShareBean
{
	private int count = 0;

	public void get() 
	{
		System.out.println(Thread.currentThread().getName()
				+ ",after increment:" + count);
	}

	public void autoInc() 
	{
		System.out.println(Thread.currentThread().getName()
				+ ",before increment:" + count);
		count++;
	}
}

 

2、定义一个线程实现类,用来访问共享bean中的方法

package thread;

import bean.IShareBean;

public class ThreadBody implements Runnable
{
	private IShareBean bean = null;

	public ThreadBody(IShareBean bean) 
	{
		this.bean = bean;
	}

	@Override
	public void run() 
	{
		bean.autoInc();
		
		try 
		{
			Thread.sleep(1000);
		} catch (InterruptedException e)
		{
			e.printStackTrace();
		}
		
		bean.get();
	}
}

 

3、测试线程安全

import thread.ThreadBody;
import bean.IShareBean;
import bean.impl.SafeShareBeanImpl;
import bean.impl.UnSafeShareBeanImpl;

public class Client {

	public static void main(String[] args) 
	{
		//会被线程共享的对象
		IShareBean unsafe = new UnSafeShareBeanImpl();
		IShareBean safe = new SafeShareBeanImpl();
		
		// 线程1和2,共享unsafe
		Thread one = buildThread("unsafe-thread-1", unsafe);
		Thread two = buildThread("unsafe-thread-2", unsafe);
		
		// 线程安全3和4,共享safe
		Thread three = buildThread("safe-thread-1", safe);
		Thread four = buildThread("safe-thread-2", safe);

		three.start();
		four.start();
		one.start();
		two.start();
	}

	public static Thread buildThread(String name, IShareBean bean) {
		ThreadBody body = new ThreadBody(bean);
		Thread thread = new Thread(body);
		thread.setName(name);
		return thread;
	}
}

 

运行以上代码可以发现,使用ThreadLocal,的确以一种很优雅的方式解决了线程安全问题。

 

 

 

  

2
1
分享到:
评论
1 楼 zh_harry 2013-07-25  
ThreadLocal独家解秘 附JDK源码
http://lizhizhang.iteye.com/blog/1909765

相关推荐

    旧版本JDK JDK1.4

    尽管现在已经被更新的版本如JDK 8、JDK 11和JDK 17所取代,但JDK 1.4对于理解Java的发展历程具有重要意义。 **主要特性** 1. **异常链**:在JDK 1.4中,引入了异常链机制,允许一个异常捕获另一个异常,并将它们...

    jdk-17.0.8(jdk-17-linux-x64-bin.tar.gz)

    Java开发工具包(Java Development ...理解并掌握JDK 17.0.8的功能和使用方法对于Java开发者至关重要,因为它是构建、测试和部署Java应用的基础。开发者可以根据自身需求选择适合的JDK版本,以保证代码的兼容性和性能。

    jdk_1.9_中,英文api

    这个压缩包提供了JDK 1.9的API文档,分为中文版和英文版,方便不同语言背景的开发者理解和使用。 **模块化系统(Module System)** JDK 1.9引入了Java平台模块系统(Project Jigsaw),这是一个重大的架构改变,...

    这是jdk1.4

    **Java Development Kit (JDK) 1.4详解** JDK(Java Development Kit)是Java编程...随着技术的不断进步,后续的JDK版本在JDK 1.4的基础上继续拓展,但了解这一版本对于理解Java发展历程和学习其核心技术至关重要。

    Java JDK手册 (中文版,英文版)1.7+1.8+9+10.7z

    本压缩包提供了1.7、1.8、9和10四个版本的Java JDK手册,分别以CHM(Compiled Help Manual)格式呈现,这是一种微软开发的帮助文件格式,方便用户快速查找和阅读。 1. **Java JDK 1.7**: - Java 7(也称为JDK 1.7...

    jdk1.4压缩包

    Java Development Kit (JDK) 1.4 是Java平台的一个重要版本,由Sun Microsystems(现已被Oracle公司...虽然现在JDK已经更新到了更高的版本,但了解JDK 1.4对于理解Java的发展历史和掌握其核心概念仍然具有重要意义。

    JDK6-15中英文API

    JDK(Java Development Kit)是Java编程语言的核心组件,它包含了Java运行环境、编译器和各种工具,使开发者能够编写、测试和部署Java应用程序。本资源集合了从JDK6到JDK15的中英文API文档,这对于Java开发者来说是...

    jdk-1_5_0-windows-i586(1)

    这个版本的JDK是Oracle公司发布的一个重要的Java开发工具集,包含了编译器、调试器、文档生成器以及各种Java应用程序接口(API)的头文件和库,使得开发者能够编写、测试和部署Java应用程序。 描述中同样提到了...

    Java高级编程(JDK6版)原书代码

    12. **JUnit测试**:虽然JDK6本身不包含JUnit,但它是Java开发的标准测试框架,通过断言、测试套件和注解简化了单元测试。 以上只是部分可能涉及的Java高级编程知识点,实际的"Java高级编程(JDK6版)"可能会详细...

    openjdk-14.0.2_windows-x64_bin.zip

    在开发环境中,JDK提供的工具包括编译器javac、jar打包工具、Javadoc文档生成器、JShell(交互式REPL,用于测试代码片段)以及各种诊断和性能分析工具,如jps、jinfo、jmap和jstack等。这些工具对于理解和调试Java...

    Java系统中内存泄漏测试方法的研究

    总结,Java系统中的内存泄漏测试和分析涉及多个方面,包括理解内存管理机制、识别泄漏原因、使用专业工具以及制定有效的解决方案。开发者应当养成良好的编程习惯,注重代码质量,以减少内存泄漏的发生。同时,利用...

    Spring常见面试题

    动态代理需要jdk代理和cglib代理,jdk代理需要类加载器、接口、handler,cglib需要继承被代理类。 Spring框架 Spring框架是一个轻量级的Java开源框架,提供了一个通用的编程模型和配置机制。Spring框架模块有: *...

    Spring.3.x企业应用开发实战(完整版).part2

    经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用Spring的各项功能的同时,还能透彻理解Spring的内部实现,真正做到知其然知其所以然。...

    Spring3.x企业应用开发实战(完整版) part1

    经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用Spring的各项功能的同时,还能透彻理解Spring的内部实现,真正做到知其然知其所以然。...

    java并发编程经典书籍(英文版)

    Java并发编程是Java开发者必须掌握的关键技能之一,尤其是在多核处理器和分布式系统广泛使用的今天。以下是对标题和描述中提及的两本经典书籍——《Concurrent Programming in Java》和《Java Concurrency in ...

    java面试题及其答案

    以上内容仅仅是Java面试中可能涉及的一部分知识点,深入学习和理解这些概念对于成为一名合格的Java开发者至关重要。在面试中,面试官可能会通过各种问题来测试候选人在这些领域的知识深度和实践经验。

    JAVA语言自学全套教程百度云链接

    你将学会如何创建和使用类,理解对象之间的关系,并掌握抽象类和接口的应用。 3. **异常处理**:Java的异常处理机制是其强大之处,它可以帮助你编写健壮的代码。这部分会教你如何使用try-catch-finally语句块,以及...

    Struts+Hibernate+Spring常见面试题

    另外,可以通过实现`ActionSupport`的`validate()`方法进行请求级别的数据校验,或者使用基于拦截器的线程绑定解决方案,如Spring的`ThreadLocal`。 【Hibernate】 Hibernate是一个对象关系映射(ORM)框架,用于...

Global site tag (gtag.js) - Google Analytics