threadlocal

java多线程学习总结

孤街醉人 提交于 2019-11-28 08:10:10
Java 多线程基础总结: 1. 使用 synchronized 关键字 2. 使用 JDK 5 中提供的 java.util.concurrent.lock 包中的 Lock 对象。 一. synchronized 关键字 java 线程同步的基本原理是采用了锁的机制,在 jvm 中,每个对象和类都分配一个锁和它关联,对象锁保护对象的实例变量,类锁其实也是通过对象锁来实现的,通过保护类的 Class 对象,实现锁对类的保护。 如果一个线程获取了某个对象的锁,其他线程就不能再获取该对象的锁了。在 java 程序中,使用 synchronized 块或者 synchronized 方法就可以标识一个同步区域,进入同步区域,需要得到同步区域指定的锁,进入 synchronized 方法需要的对象锁为当前对象,而进入 synchronized 块则需要得到 synchronized 关键字指定的对象的对象锁。一下为使用两者的例子: public synchronized void run() { for (int i = 1; i < 1000; i++) { System.out.println("No." + threadNo + ":" + i); } public void run() { synchronized(lock){ for (int i = 1; i < 1000;

ThreadLocal 是怎么实现的?

让人想犯罪 __ 提交于 2019-11-27 22:04:25
ThreadLocal 是怎么实现的? ThreadLocal 大家都很熟悉了,那么他是如何工作的呢? 下面按照我们平时的使用顺序,来扒一扒他的实现机制(注意源码只提供了必要内容) 代码版本 jdk8 ThreadLocal() set() 划重点 大家要认真看帖 get() remove() ThreadLocal /** * Creates a thread local variable. * @see #withInitial(java.util.function.Supplier) */ public ThreadLocal() { } 诶? 什么都没有! 惊喜不惊喜? 意外不意外? set()方法 核心方法ThreadLocal的主要逻辑都在这里了 public void set(T value) { // 拿到当前线程 Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) // 直觉告诉我这里不简单 map.set(this, value); else // 直觉告诉我这里不简单 createMap(t, value); } ThreadLocalMap getMap(Thread t) { return t.threadLocals; }

多线程--ThreadLocal类

拜拜、爱过 提交于 2019-11-27 22:00:54
一.ThreadLocal类简介 --此类是在整个开发过程中至关重要的类,他主要是在开发过程中解决了核心资源和多线程并发访问的处理情况 --在真正去了解ThreadLocal类作用的时候,我们可以先编写一个简单的程序做一个前期的分析 --范例:现在定义这样的一个结构 1 package 多线程.threadlocal类; 2 3 /** 4 * @author : S K Y 5 * @version :0.0.1 6 */ 7 class Channel { //消息的发送通道 8 private static Message message; 9 10 public static void setMessage(Message message) { 11 Channel.message = message; 12 } 13 14 public static void send() { //发送消息 15 System.out.println("消息发送: " + message.getInfo()); 16 } 17 } 18 19 class Message { //要发送的消息体 20 private String info; 21 22 public String getInfo() { 23 return info; 24 } 25 26 public void

java.lang.ThreadLocal类研究

你说的曾经没有我的故事 提交于 2019-11-27 20:18:42
java.lang.ThreadLocal类研究 1、概述 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是thread local variable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是Java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。 从线程的角度看,每个线程都保持一个对其线程局部变量副本的隐式引用,只要线程是活动的并且 ThreadLocal 实例是可访问的;在线程消失之后,其线程局部实例的所有副本都会被垃圾回收(除非存在对这些副本的其他引用)。 通过ThreadLocal存取的数据,总是与当前线程相关,也就是说,JVM 为每个运行的线程,绑定了私有的本地实例存取空间,从而为多线程环境常出现的并发访问问题提供了一种隔离机制。 ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单,在ThreadLocal类中有一个Map,用于存储每一个线程的变量的副本。 概括起来说,对于多线程资源共享的问题,同步机制采用了"以时间换空间"的方式,而ThreadLocal采用了"以空间换时间"的方式

synchronized与ThreadLocal

杀马特。学长 韩版系。学妹 提交于 2019-11-27 20:18:05
synchronized是实现java的同步机制。同步机制是为了实现同步多线程对相同资源的并发访问控制。保证多线程之间的通信。 同步的主要目的是保证多线程间的数据共享。同步会带来巨大的性能开销,所以同步操作应该是细粒度的。如果同步使用得当,带来的性能开销是微不足道的。使用同步真正的风险是复杂性和可能破坏资源安全,而不是性能。 ThreadLocal是采用哈希表的方式来为每个线程都提供一个变量的副本。 Synchronized还是ThreadLocal? ThreadLocal以空间换取时间,提供了一种非常简便的多线程实现方式。因为多个线程并发访问无需进行等待,所以使用ThreadLocal会获得更大的性能。虽然使用ThreadLocal会带来更多的内存开销,但这点开销是微不足道的。因为保存在ThreadLocal中的对象,通常都是比较小的对象。另外使用ThreadLocal不能使用原子类型,只能使用Object类型。ThreadLocal的使用比synchronized要简单得多。 ThreadLocal和Synchonized都用于解决多线程并发访问。但是ThreadLocal与synchronized有本质的区别。synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问。而ThreadLocal为每一个线程都提供了变量的副本

java 多线程-ThreadLocal

半城伤御伤魂 提交于 2019-11-27 19:31:23
ThreadLocal:每个线程自身的存储本地、局部区域,类似于容器,每个线程都会在其中有一定存储空间 常用的方法get/set/initialValue 官方建议为private static 每个线程存储自己的数据,更改不会影响其他线程 ThreadLocal 子类InheritableThreadLocal: 继承上下文环境的数据 public class my { //Integer 初始值为null //private static ThreadLocal<Integer> threadlocal=new ThreadLocal<>(); //更改初始值需要创建ThreadLocal的子类重写initialValue或者使用lambda(jdk8) private static ThreadLocal<Integer> threadlocal=new ThreadLocal <Integer>() {//父类匿名内部类重写方法 protected Integer initialValue() { return 200; } }; //private static ThreadLocal<Integer> threadlocal=new ThreadLocal.withInitial(()->200); public static void main(String[

Java多线程下 ThreadLocal 的应用实例

落花浮王杯 提交于 2019-11-27 16:14:46
ThreadLocal很容易让人望文生义,想当然地认为是一个“本地线程” 。其实,ThreadLocal并不是一个 Thread,而是 Thread 的局部变量,也许把它命名为 ThreadLocalVariable更容易让人理解一些。当使用 ThreadLocal 维护变量时,ThreadLocal 为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 首先 ,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的。各个线程中访问的是不同的对象。 另外 ,说ThreadLocal使得各线程能够保持各自独立的一个对象,并不是通过ThreadLocal.set()来实现的,而是通过每个线程中的new 对象 的操作来创建的对象,每个线程创建一个,不是什么对象的拷贝或副本。通过ThreadLocal.set()将这个新创建的对象的引用保存到各线程的自己的一个map中,每个线程都有这样一个map,执行ThreadLocal.get()时,各线程从自己的map中取出放进去的对象,因此取出来的是各自自己线程中的对象,ThreadLocal实例是作为map的key来使用的。

多线程——彻底理解ThreadLocal

雨燕双飞 提交于 2019-11-27 13:16:48
ThreadLocal是什么   早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。    当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。   从线程的角度看,目标变量就象是线程的本地变量,这也是类名中“Local”所要表达的意思。   所以,在Java中编写线程局部变量的代码相对来说要笨拙一些,因此造成线程局部变量没有在Java开发者中得到很好的普及。 ThreadLocal的接口方法 ThreadLocal类接口很简单,只有4个方法,我们先来了解一下: void set(Object value)设置当前线程的线程局部变量的值。 public Object get()该方法返回当前线程所对应的线程局部变量。 public void remove()将当前线程局部变量的值删除,目的是为了减少内存的占用,该方法是JDK 5.0新增的方法。需要指出的是,当线程结束后,对应该线程的局部变量将自动被垃圾回收,所以显式调用该方法清除线程的局部变量并不是必须的操作,但它可以加快内存回收的速度。 protected

ThreadLocal 类用法讲解

这一生的挚爱 提交于 2019-11-27 13:16:30
首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的。 各个线程中访问的是不同的对象。 另外,说ThreadLocal使得各线程能够保持各自独立的一个对象,并不是通过ThreadLocal.set()来实现的,而是通过每个线程中的new 对象 的操作来创建的对象,每个线程创建一个,不是什么对象的拷贝或副本。 通过ThreadLocal.set()将这个新创建的对象的引用保存到各线程的自己的一个map中,每个线程都有这样一个map,执行ThreadLocal.get()时,各线程从自己的map中取出放进去的对象,因此取出来的是各自自己线程中的对象,ThreadLocal实例是作为map的key来使用的。 如果ThreadLocal.set()进去的东西本来就是多个线程共享的同一个对象,那么多个线程的ThreadLocal.get()取得的还是这个共享对象本身,还是有并发访问问题。 下面来看一个hibernate中典型的ThreadLocal的应用: Java代码 private static final ThreadLocal threadSession = new ThreadLocal(); public static Session

ThreadLocal in Java

依然范特西╮ 提交于 2019-11-27 13:15:42
ThreadLocal in Java is another way to achieve thread-safety apart from writing immutable classes. If you have been writing multi-threaded or concurrent code in Java then you must be familiar with cost of synchronization or locking which can greatly affect Scalability of application, but there is no choice other than synchronize if you are sharing objects between multiple threads. ThreadLocal in Java is a different way to achieve thread-safety, it doesn't address synchronization requirement, instead it eliminates sharing by providing explicitly copy of Object to each thread. Since Object is no