`

Java之ThreadLocal(Synchronized)

    博客分类:
  • Java
阅读更多
参考资料
1 深入研究java.lang.ThreadLocal类
http://lavasoft.blog.51cto.com/62575/51926
2 java中ThreadLocal类的使用
http://www.niwota.com/submsg/1551983/
3 Java ThreadLocal介绍
http://www.blogjava.net/Ericzhang5231/articles/JavaThreadlocal.html
4 Java中ThreadLocal的设计与使用
http://www.yesky.com/266/1882766.shtml
一 ThreadLocal介绍
ThreadLocal是Thread local variable(线程局部变量),为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有该变量.
二 ThreadLocal与synchronized的区别
ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题
Synchronized用于在多个线程间通信时能够获得数据共享,它利用锁的机制,使变量或代码块在某一时该只能被一个线程访问,采用了“以时间换空间”的方式,仅提供一份变量,让不同的线程排队访问,编写比ThreadLocal更加复杂。
ThreadLocal则用于线程间的数据隔离,主要解决多线程中数据数据因并发产生不一致问题同,它采用了“以空间换时间”的方式。为每一个线程都提供了一份变量,因此可以同时访问而互不影响.
三 具体示例
import java.util.Random;
public class ThreadLocalTest {

	public static void main(String[] args) {
		init();
	}

	private static void init() {
		for (int i = 0; i < 2; i++) {
			new Thread(new Runnable() {
				@Override
				public void run() {

					int num = new Random().nextInt();
					System.out.println(Thread.currentThread().getName()+",main: " + num);					
					User.getInstance().setAge(num);
					User.getInstance().setName("name"+num);					
					new TaskA().show();
					new TaskB().show();

				}
			}).start();
		}
	}

	static class TaskA {
		public void show() {
			int num = User.getInstance().getAge();
			String name = User.getInstance().getName();
			System.out.println("A num: " + num + ",name: " + name);
		}
	}

	static class TaskB {
		public void show() {
			int num = User.getInstance().getAge();
			String name = User.getInstance().getName();
			System.out.println("B num: " + num + ",name: " + name);
		}
	}
}

class User{
	
	private String name;
	private int age;
	
	private static ThreadLocal<User> threadLocal = new ThreadLocal<User>();
	
	public static User getInstance(){
		User user = threadLocal.get();
		if(null == user){
			user = new User();
			threadLocal.set(user);
		}
		return user;
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}	
}

输出结果如下:
Thread-0,main: 1833403530
A num: 1833403530,name: name1833403530
B num: 1833403530,name: name1833403530
Thread-1,main: 1589097477
A num: 1589097477,name: name1589097477
B num: 1589097477,name: name1589097477

从结果中可以查看到,每个线程之间的数据是完全隔离的,互不影响
总结:ThreadLocal是解决线程安全问题一个很好的思路,它通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题。在很多情况下, ThreadLocal比直接使用synchronized同步机制解决线程安全问题更简单,更方便,且结果程序拥有更高的并发性.
分享到:
评论

相关推荐

    线程安全你还在用synchronized?

    你还在用synchronized?线程安全相关知识深入剖析

    Java多线程 之 临界区、ThreadLocal.docx

    synchronized关键字不属于方法特征签名的一部分,所以可以在覆盖方法的时候加上去。也就是说,在父类的方法声明上可以没有synchronized关键字,而在子类覆盖该方法时加上synchronized关键字。 注意:使用...

    谈谈Java中的ThreadLocal

     需要重点强调的的是,不要拿ThreadLocal和synchronized做类比,因为这种比较压根是无意义的!sysnchronized是一种互斥同步机制,是为了保证在多线程环境下对于共享资源的正确访问。而ThreadLocal从本质上讲,无非...

    Java中的线程同步与ThreadLocal无锁化线程封闭实现

    主要介绍了Java中的线程同步与ThreadLocal无锁化线程封闭实现,Synchronized关键字与ThreadLocal变量的使用是Java中线程控制的基础,需要的朋友可以参考下

    java学习整理文档.docx

    java 学习整理文档 Spring框架并没有对单例bean进行任何多线程的封装处理。关于单例bean的线程安全和并发问题需要开发者自行去搞定 最浅显的解决办法就是将多态bean的作用域由“singleton”变更为“prototype”或者...

    java线程学习笔记

    2.3 线程本地存储(Java.lang.ThreadLocal) 15 2.4 线程阻塞 17 2.4.1 调用sleep(millisecond)使任务进入休眠状态 17 2.4.2 等待输出与输入 17 2.4.3 对象锁不可用 17 2.4.4 通过wait()使线程挂起。 17 2.5 线程...

    Java并发编程学习笔记

    1、线程安全和锁 Synchronized 底层实现原理 2、可重入锁与 Synchronized 的其他特性 3、ThreadLocal 的底层实现与使用 4、ReentrantLock底层实现和如何使用 5、Condition源码分析 6、ReentrantReadWriteLock底层...

    java并发编程面试题

    java并发编程 基础知识,守护线程与线程, 并行和并发有什么区别? 什么是上下文切换? 线程和进程区别 什么是线程和进程? 创建线程有哪几种方式?,如何避免线程死锁 ...ThreadLocal内存泄漏分析与

    Java进阶教程,面试大全

    synchronized在静态方法和普通方法的区别。 怎么实现所有线程在等待某个事件的发生才会去执行。 CAS。 Hashtable是怎么加锁的。 HashMap的并发问题。 ConcurrenHashMap 介绍。 AQS。 如何检测死锁,怎么预防死锁。 ...

    Java常见面试题208道.docx

    51.ThreadLocal 是什么?有哪些使用场景? 52.说一下 synchronized 底层实现原理? 53.synchronized 和 volatile 的区别是什么? 54.synchronized 和 Lock 有什么区别? 55.synchronized 和 ReentrantLock 区别是...

    Java进阶教程,面试大全,包罗万象

    synchronized在静态方法和普通方法的区别。 怎么实现所有线程在等待某个事件的发生才会去执行。 CAS。 Hashtable是怎么加锁的。 HashMap的并发问题。 ConcurrenHashMap 介绍。 AQS。 如何检测死锁,怎么预防死锁。 ...

    【2018最新最详细】并发多线程教程

    17.并发容器之ThreadLocal 18.一篇文章,从源码深入详解ThreadLocal内存泄漏问题 19.并发容器之BlockingQueue 20.并发容器之ArrayBlockingQueue和LinkedBlockingQueue实现原理详解 21.线程池ThreadPoolExecutor实现...

    Java并发编程相关技术使用案例

    线程创建、Synchronized和Reentrantlock锁的使用、线程安全问题演示、Condition的应用、CountDownLatch的应用、Cyclicbarrier的应用、Semaphore的应用、线程池的应用、Completablefuture的应用、手写阻塞队列、fork...

    Java并发编程原理与实战

    ThreadLocal 使用及实现原理.mp4 并发工具类CountDownLatch详解.mp4 并发工具类CyclicBarrier 详解.mp4 并发工具类Semaphore详解.mp4 并发工具类Exchanger详解.mp4 CountDownLatch,CyclicBarrier,Semaphore源码解析....

    实战Java高并发程序设计(第2版)PPT模板.pptx

    4锁的优化及注意事项 4.1有助于提高锁性能的几点建议 4.2java虚拟机对锁优化所做的努力 4.3人手一支笔:threadlocal 4.4无锁 4.5有关死锁的问题 4.2Java虚拟机对锁优化所做的努力 4.3人手一支笔:ThreadLocal 4.4...

    史上最全java面试,103项重点知识,带目录

    51. ThreadLocal 是什么?有哪些使用场景? 20 52.说一下 synchronized 底层实现原理? 20 53. synchronized 和 volatile 的区别是什么? 21 54. synchronized 和 Lock 有什么区别? 21 55. synchronized 和 ...

    龙果java并发编程完整视频

    第36节ThreadLocal 使用及实现原理00:17:41分钟 | 第37节并发工具类CountDownLatch详解00:22:04分钟 | 第38节并发工具类CyclicBarrier 详解00:11:52分钟 | 第39节并发工具类Semaphore详解00:17:27分钟 | 第40节...

    leetcode下载-JavaTopic:Java面试题总结

    Java并发锁synchronized、reentractlock的用法 HashMap数据结构及原理 ConcurrentHashMap数据结构及原理,分段锁机制 NIO、BIO相关 Java多线程篇: 线程池的核心参数及用法说明? 多线程死锁如何排查(考察linux

    龙果 java并发编程原理实战

    第36节ThreadLocal 使用及实现原理00:17:41分钟 | 第37节并发工具类CountDownLatch详解00:22:04分钟 | 第38节并发工具类CyclicBarrier 详解00:11:52分钟 | 第39节并发工具类Semaphore详解00:17:27分钟 | 第40节...

Global site tag (gtag.js) - Google Analytics