threadlocal

Java多线程同步方法

◇◆丶佛笑我妖孽 提交于 2020-03-22 18:50:35
一、同步方法   即有 synchronized关键字修饰的方法 。 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。 注: synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类。 二、同步代码块   即有synchronized关键字修饰的语句块。 被synchronized关键字修饰的语句块会自动被加上内置锁,从而实现同步 代码如: synchronized(object){ } 注:同步是一种高开销的操作,因此应该尽量减少同步的内容。 通常没有必要同步整个方法,使用synchronized代码块同步关键代码即可。 线程在执行同步方法时是具有排它性的。 当任意一个线程进入到一个对象的任意一个 同步方法 时,这个对象的所有同步方法都被锁定了,在此期间,其他任何线程都不能访问这个对象的任意一个同步方法,直到这个线程执行完它所调用的同步方法并从中退出,从而导致它释放了该对象的同步锁之后。 在一个对象被某个线程锁定之后,其他线程是可以访问这个对象的所有非同步方法的。 同步块:同步块是通过锁定一个指定的对象,来对同步块中包含的代码进行同步; 而同步方法是对这个方法块里的代码进行同步,而这种情况下锁定的对象就是同步方法所属的主体对象自身。如果这个方法是静态同步方法呢

Android的Handler,Message,Looper的原理详解

狂风中的少年 提交于 2020-03-17 16:46:20
某厂面试归来,发现自己落伍了!>>> 先说说Looper类:Looper就是为每一个线程创建一个Looper对象,维护一个MessageQueue,并循环从MessageQueue中取出消息并分发给Handler执行。下面是Looper源码中如何使用的一个示例 class LooperThread extends Thread { * public Handler mHandler; * * public void run() { * Looper.prepare(); * * mHandler = new Handler() { * public void handleMessage(Message msg) { * // process incoming messages here * } * }; * * Looper.loop(); * } * } 我们看看Looper.prepare干了些什么事 public static void prepare() { prepare(true); } //判断当前线程是否有Looper对象,没有则new一个并放到ThreadLocal中 private static void prepare(boolean quitAllowed) { if (sThreadLocal.get() != null) { throw new

ThreadLocal原理

感情迁移 提交于 2020-03-17 11:06:04
ThreadLocal作用 ThreadLocal是一个线程内部的数据存储类,通过它可以在指定的线程中存储数据,数据存储以后,只有在指定的线程中可以获取到存储的数据,对于其他线程来说则无法取到数据。 ThreadLocal源码 // Thread类中持有ThreadLocalMap,这个ThreadLocalMap里的Entry是继承WeakReference,hash冲突解决法是 开放地址法 ThreadLocal . ThreadLocalMap threadLocals = null ; // 由于ThreadLocalMap是跟随着具体的线程,所以自然get()时是获取当前线程的东西不会获取其他线程的数据。 public T get ( ) { Thread t = Thread . currentThread ( ) ; ThreadLocalMap map = getMap ( t ) ; if ( map != null ) { // 以自身为key,因为一个线程可以存多个不同的ThreadLocal的东西 ThreadLocalMap . Entry e = map . getEntry ( this ) ; if ( e != null ) { @SuppressWarnings ( "unchecked" ) T result = ( T ) e . value

并发编程之ThreadLocal详解

冷暖自知 提交于 2020-03-17 01:26:16
某厂面试归来,发现自己落伍了!>>> ThreadLocal 什么是ThreadLocal: 它提供线程本地变量,如果创建一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个副本,在实际多线程操作的时候,操作的是自己本地内存中的变量,从而规避了线程安全问题。 API讲解: void set(T value)设置当前线程的线程局部变量的值; T get()该方法返回当前线程所对应的线程局部变量; void remove() 将当前线程局部变量的值删除,目的是为了减少内存的占用,该方法是JDK 5.0新增的方法。需要指出的是,当线程结束后,对应该线程的局部变量将自动被垃圾回收,所以显式调用该方法清除线程的局部变量并不是必须的操作,但它可以加快内存回收的速度。 源码分析: ThreadLocal在使用的时候:对象实例与ThreadLocal变量的映射关系是由线程Thread来维护的。 上述解释:对象实例与ThreadLocal变量的映射关系是存放在一个Map中的,这个map是一个抽象的map并不是java.util中的map。该map是Thread类中的一个字段而已!而真正存放映射关系的map是ThreadLocalMap。 核心描述:当我们创建一个Thread时内部有一个ThreadLocalMap变量该变量又是一个内部类,其内部有包含一个Entry变量

java子线程中获取父线程的threadLocal中的值

妖精的绣舞 提交于 2020-03-11 12:48:24
我们都知道线程本地变量表也就是ThreadLocal在我们做线程级的数据隔离时非常好用,但是有时候我们会想如何让子线程获取到父线程的ThreadLocal,其实在线程中除了ThreadLocal外还有InheritableThreadLocal,顾名思义,可继承的线程变量表,可以让子线程获取到父线程中ThreadLocal的值。 public class BaseTest { public static final InheritableThreadLocal<String> inheritableThreadLocal = new InheritableThreadLocal<>(); public static final ThreadLocal<String> threadLocal = new ThreadLocal<>(); public static void main(String[] args) { inheritableThreadLocal.set("Inheritable hello"); threadLocal.set("hello"); new Thread(()->{ System.out.println(String.format("子线程可继承值:%s",inheritableThreadLocal.get())); System.out

弄懂 ThreadLocal,看这一篇就够了

独自空忆成欢 提交于 2020-03-11 03:07:27
1 什么是 ThreadLocal? ThreadLocal 类用于提供线程内部的局部变量,变量在多线程环境下访问(通过 get 和 set 方法访问)时能保证各个线程的变量相对独立于其他线程内的变量。ThreadLocal 实例通常来说都是 private static 类型的,用于关联线程和线程上下文。 ThreadLocal 有几个常用的方法,分别为 set(存储),get(获取),remove(删除),下面我会对这几个方法分别进行介绍。 2 set 方法 我们如何设置当前线程对应的值呢?通过 set 方法即可。 public void set ( T value ) { //获取当前线程 Thread t = Thread . currentThread ( ) ; //实际存储的数据结构类型 ThreadLocalMap map = getMap ( t ) ; //如果存在map就直接set,没有则创建map并set if ( map != null ) map . set ( this , value ) ; else createMap ( t , value ) ; } getMap 方法的实现如下: ThreadLocalMap getMap ( Thread t ) { //thred中维护了一个ThreadLocalMap return t .

面试大厂一定离不开的——ThreadLocal,它的实现原理你知道吗?

你。 提交于 2020-03-11 00:13:20
使用场景 假设我们有一个数据库连接管理类: class ConnectionManager { private static Connection connect = null; private static String url = System.getProperty("URL"); public static Connection openConnection() { if(connect == null){ try { connect = DriverManager.getConnection(url); } catch (SQLException e) { e.printStackTrace(); } } return connect; } public static void closeConnection() { if(connect!=null) { try { connect.close(); } catch (SQLException e) { e.printStackTrace(); } } } } 如果这个类被用在多线程环境内,则会存在线程安全问题,那么可以对这两个方法添加synchronized关键字进行同步处理,不过这样会大大降低程序的性能,也可以将connection变成局部变量: class ConnectionManager { private

ThreadLocal及Java引用类型

99封情书 提交于 2020-03-09 19:33:33
一、引用类型 1、强引用(Strong Reference) 一般用到最多的是强引用 2、软引用(Soft Reference) 如果一个对象没有强引用,只有软引用,当JVM发现内存不够时,垃圾回收器便会回收这些对象 3、弱引用(Weak Reference) 如果一个对象只有弱引用时,每次垃圾回收都会被回收 4、幻影引用(Phantom Reference) 如果一个对象仅持有幻影引用,那么它就和没有引用指向它一样,在任何时候该对象都可能被垃圾回收器回收。 幻影引用与软引用和弱引用的区别在于幻影引用必须和引用队列ReferenceQueue一起使用,幻影引用可以用来跟踪对象被回收的活动,因为当垃圾回收器准备回收一个对象的时候,如果发现它还有幻影引用,就会在回收之前,把这个幻影引用加入到与之关联的引用队列中去。 这样,程序通过判断引用队列中是否已经加入了幻影引用,来了解被引用对象是否将要被垃圾回收器回收,如果发现某个幻影引用已经被加入到引用队列,那么就可以在引用对象被回收之前采取必要的行动。 二、ThreadLocal 1、简介 ThreadLocal使用了弱引用,在一定程度上可以防止内存泄露。 2、ThreadLocal.ThreadLocalMap 此map使用的key是经过WeakReference包装的ThreadLocal对象

并发设计模式1-避免共享

假如想象 提交于 2020-03-07 02:24:59
并发问题产生条件:多个线程同时对共享变量进行读写操作。 解决并发问题,我们平时都是加互斥锁,防止同时进行读写操作,其实换个角度想, 避免共享 ,就可以了。 接下来介绍三种避免共享的三种模式: Immutability 模式、Copy-on-Write 模式和线程本地存储模式。 Immutability 模式(不变性模式) 该模式解决并发问题的思路就是让共享变量只有读操作,没有写操作。即,不变性,**就是创建对象之后,状态就不再发生变化。**变量一旦赋值就不允许赋值。 如何实现不可变性的类? 将所有的属性都设置成final; 只允许存在只读方法; 如果类的属性是引用型,该属性对应的对象也应该是不可变对象。 不可变对象的应用 其实JAVA SDK中很多类都具备不可变性,比如经常用到的基本类型的包装类Integer,String,Long,Double等,内部都实现了不可变性,其属性都是final类型的,但是你会发现一个问题, 这些类中有存在修改的方法,比如String.replace方法 ,这是怎么回事呢? String replace ( char oldChar , char newChar ) { 。。。。省略 //创建一个新的字符串返回 //原字符串不会发生任何变化 return new String ( buf , true ) ; } 它是创建了新的String对象返回

ThreadLocal

不羁的心 提交于 2020-03-06 09:05:00
所属包 : java.lang; 描述 : ThreadLocal类提了供线程本地变量。它与普通变量的区别在于,每个使用该变量的线程都会初始化一个完全独立的副本。ThreadLocal 变量通常被private static修饰,用于关联线程上下文。 错误的理解 : ThreadLocal为解决多线程程序的并发问题提供了一种新的思路 ;ThreadLocal的目的是为了解决多线程访问资源时的共享问题; 解决的问题 : ThreadLocal提供了线程本地变量,每个线程都有一个该变量的副本,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度 应用场景 : 当一个变量需要在线程间隔离而在方法或类间共享时,可以使用ThreadLocal ; 案例 :利用ThreadLocal设计一个 懒汉式的单例模式 线程上下文工具类,应用场景:线程上下文传参 public class ThreadContextUtil { private static ThreadLocal < Map < String , Object > > threadContext = new ThreadLocal < Map < String , Object > > ( ) ; private static volatile ThreadContextUtil