`

java 多线程初学(ThreadLocal类学习)

 
阅读更多

ThreadLocal是解决线程安全问题一个很好的思路,它通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题。在很多情况下,ThreadLocal比直接使用synchronized同步机制解决线程安全问题更简单,更方便,且结果程序拥有更高的并发性。

        在Java的多线程编程中,为保证多个线程对共享变量的安全访问,通常会使用synchronized来保证同一时刻只有一个线程对共享变量进行操作。但在有些情况下,synchronized不能保证多线程对共享变量的正确读写。例如类有一个类变量,该类变量会被多个类方法读写,当多线程操作该类的实例对象时,如果线程对类变量有读取、写入操作就会发生类变量读写错误,即便是在类方法前加上synchronized也无效,因为同一个线程在两次调用方法之间时锁是被释放的,这时其它线程可以访问对象的类方法,读取或修改类变量。这种情况下可以将类变量放到ThreadLocal类型的对象中,使变量在每个线程中都有独立拷贝,不会出现一个线程读取变量时而被另一个线程修改的现象。

     下面是ThreadLocal的实现原理

 

public class SimpleThreadLocal {
  private Map valueMap = Collections.synchronizedMap(new HashMap());
  public void set(Object newValue) {
  valueMap.put(Thread.currentThread(), newValue);①键为线程对象,值为本线程的变量副本
  }
  public Object get() {
  Thread currentThread = Thread.currentThread();
  Object o = valueMap.get(currentThread);②返回本线程对应的变量
  if (o == null && !valueMap.containsKey(currentThread)) {③如果在Map中不存在,放到Map
  中保存起来。
  o = initialValue();
  valueMap.put(currentThread, o);
  }
  return o;
  }
  public void remove() {
  valueMap.remove(Thread.currentThread());
  }
  public Object initialValue() {
  return null;
  }
  }

 

 其中 initalValue是protected的,留给子类实现,默认返回null值。

 

一个demo

 

package TreaditionThread;

import java.util.HashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadLocalTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ExecutorService exec = Executors.newCachedThreadPool();
		for (int i = 0; i < 2; i++) {
			exec.execute(new Task());
		}
		exec.shutdown();
	}

}

class Task implements Runnable {

	public void run() {
		// TODO Auto-generated method stub
		MyThreadLocalData.getInstanceMap().put("key",
				Thread.currentThread().getName());
		new A().get();
		new B().get();
	}

}

class A {
	public void get() {
		HashMap<String, Object> m = MyThreadLocalData.getInstanceMap();
		if (m != null) {
			System.out.println("A:" + m.get("key"));
		}
	}
}

class B {
	public void get() {
		HashMap<String, Object> m = MyThreadLocalData.getInstanceMap();
		if (m != null) {
			System.out.println("B:" + m.get("key"));
		}
	}
}

class MyThreadLocalData {
	// 每个线程的专属map
	private static ThreadLocal<HashMap<String, Object>> data = new ThreadLocal<HashMap<String, Object>>();

	public static HashMap<String, Object> getInstanceMap() {
		HashMap<String, Object> m = data.get();
		if (m == null) {
			m = new HashMap<String, Object>();
			data.set(m);
		}
		return data.get();
	}
}

 output:

A:pool-1-thread-1

A:pool-1-thread-2

B:pool-1-thread-1

B:pool-1-thread-2

 

 

 

分享到:
评论

相关推荐

    java多线程的讲解和实战

    本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者以及希望深入理解多线程的开发者。 1. **线程的基本概念**:线程是程序执行的最小单位,一个进程中可以有多个线程同时运行。Java...

    Java多线程文档

    这篇"Java多线程文档"涵盖了关于Java多线程编程的重要知识点,以下是对这些内容的详细阐述: 一、线程的概念 线程是操作系统分配CPU时间的基本单元,一个进程中可以包含多个线程。Java中的线程有两种创建方式:通过...

    张孝祥Java多线程与并发库高级应用笔记

    ### 张孝祥Java多线程与并发库高级应用笔记概览 #### 一、Java多线程技术的重要性与挑战 Java线程技术是软件工程领域不可或缺的一部分,尤其在底层编程、Android应用开发以及游戏开发中,其重要性不言而喻。然而,...

    多线程的学习资料(对初学者特别有用)!

    本资源包针对初学者提供了全面的多线程学习资料,旨在帮助你快速入门并解决实际开发中的问题。 首先,线程是操作系统分配CPU时间的基本单元,它允许程序同时执行多个任务。多线程编程能够提高程序的并发性和执行...

    Java多线程-线程安全问题练习题

    在Java多线程编程中,线程安全问题是非常关键的概念,它涉及到多个线程访问共享资源时可能出现的数据不一致或异常情况。本题主要通过两个练习题来加深对线程安全的理解。 ### 练习题1:新年倒计时 #### 题目描述 ...

    JAVA线程(第三版)

    总之,《JAVA线程(第三版)》全面涵盖了Java多线程编程的各个方面,无论你是初学者还是有经验的开发者,都能从中受益匪浅。通过深入学习这本书,你可以掌握如何在Java环境中有效地管理和控制线程,避免潜在的问题,...

    Android多线程全新讲解.pdf

    2. Java多线程高级特性:内容中出现的“ThreadLocal”,“CyclicBarrier”,“CountDownLatch”,“Exchanger”,“ArrayBlockingQueue”,“Lock”,“Condition”和“Semaphore”,这些都是Java 5以后版本引入的...

    Java并发编程实践多线程

    《Java并发编程实践》是一本深入探讨Java多线程编程的权威著作,它详细阐述了在并发环境下如何设计和实现高效、可靠的程序。这本书涵盖了Java并发编程的核心概念、工具和最佳实践,对于想要提升Java并发编程技能的...

    陕西多线程1.6终极版(附查名字).rar

    这个压缩包可能包含了详细的教学资料、实例代码、讲解文档等,旨在帮助用户深入理解和应用Java多线程技术。下面我们将深入探讨多线程的相关知识点。 1. **多线程概念**:在计算机程序中,多线程是指一个程序内可以...

    多线程的实例

    在编程领域,多线程是一种...通过学习和实践这个多线程实例,初学者可以掌握多线程的基本概念和操作,为进一步的并发编程打下坚实基础。在实际开发中,理解并熟练运用多线程技术,能够编写出更高效、更稳定的软件系统。

    java线程pdf(高清晰)

    线程同步是Java中处理多线程并发问题的关键技术。主要包含以下几种方法: 1. synchronized关键字:可以用于修饰方法或代码块,实现互斥访问,防止数据不一致。 2. volatile关键字:保证变量对所有线程的可见性,但...

    java并发编程艺术

    通过阅读《Java并发编程艺术》这本书,开发者可以系统地学习Java多线程编程的各个方面,从而在实际工作中更好地应对并发编程的挑战,提高软件的性能和稳定性。无论是初学者还是经验丰富的开发人员,都能从中受益匪浅...

    多线程服务端入门.rar

    在IT领域,多线程是程序设计中的一个重要概念,尤其在服务器端开发中更是不可或缺。...这个资源“多线程服务端入门”很可能会涵盖这些基础知识,并提供实践示例,对于初学者来说是一份不错的学习材料。

    多线程01(md文档+代码)多线程01(md文档+代码)(超详细)

    本资源包“多线程01”包含了关于多线程的详细讲解,包括Markdown文档和配套代码示例,旨在帮助初学者或有经验的开发者深入理解并熟练掌握多线程技术。 一、多线程基础 多线程是指在一个进程中同时运行多个独立的...

    Java并发编程学习笔记.rar

    6. **Future和ExecutorService**:`Future`接口代表异步计算的结果,`ExecutorService`是执行器服务,两者结合可以方便地进行多线程任务的管理和结果获取。 7. **并发工具类**:`java.util.concurrent`包包含了许多...

    java学习课件

    6. **多线程**:Java内置对多线程的支持,允许并发执行任务。课件会教授如何创建和管理线程,理解线程同步和互斥的概念,如synchronized关键字、wait()、notify()和notifyAll()方法,以及使用ThreadLocal和...

    JAVA学习指导(必看的经典文章)

    多线程是Java的一个强项。理解线程的创建、同步、通信和死锁的概念,以及synchronized、volatile、ThreadLocal等关键字的使用,能够帮助你编写高效的并发程序。 对于Java的IO流和NIO(非阻塞I/O),理解流的基本...

    Java开发资料

    【Java开发资料】涵盖的主题是Java编程中的多线程技术...总的来说,这份“Java开发资料”将全面覆盖Java多线程编程的理论与实践,无论你是初学者还是有经验的开发者,都能从中获取有价值的知识,提升你的并发编程能力。

    java架构师学习大纲及视频

    2. 多线程:掌握并发编程,理解线程状态,熟悉synchronized、volatile、ThreadLocal等关键字。 3. 文件与I/O流:学习文件操作,掌握输入输出流,理解缓冲流、转换流、对象流等。 4. 网络编程:理解TCP/IP协议,学习...

Global site tag (gtag.js) - Google Analytics