ThreadLocal 和神奇的数字 0x61c88647】的更多相关文章

这篇文章会详细阐述ThreadLocal的内部结构及其原理,以及神奇的0x61c88647 在Java 1.4之前,ThreadLocals会产生线程间的竞争,无法写出高性能的代码. Java 1.5改变了它的实现,下面详细阐述ThreadLocal 的内部结构和原理, 并分析为了解决散列表的冲突而引入的神奇的hash code: 0x61c88647 1 ThreadLocal 应用场景 先举个在平时工作中经常用到的场景, 一个web应用供登录用户通过浏览器访问,后台应用会获取用户的登录信息(…
来源JDK源码,产生的数字分布很均匀 用法代码如下. # -*- coding: utf-8 -*- HASH_INCREMENT = 0x61c88647 def magic_hash(n): for i in range(n): nextHashCode = i * HASH_INCREMENT + HASH_INCREMENT print nextHashCode & (n-1) magic_hash(16)…
目录 ThreadLocal的作用 ThreadLocal 1.对象初始化 2.获取变量 3.设置变量 4.移除变量 ThreadLocalMap 1.Entry 2.初始化 3.获取Entry 4.设置Entry 5.移除Entry 网上有很多关于ThreadLocal的介绍,有的介绍比较简单,也有的介绍很复杂,比较难懂,今天,自己结合它的源码,也做个简易梳理,记录如下! ThreadLocal的作用 在多请求并发访问过程中,我们往往需要将一个指定变量隔离起来,达到只对当前线程可用,其他线程不…
A positive integer is magical if it is divisible by either A or B. Return the N-th magical number.  Since the answer may be very large, return it modulo 10^9 + 7. Example 1: Input: N = 1, A = 2, B = 3 Output: 2 Example 2: Input: N = 4, A = 2, B = 3 O…
一.ThreadLoacl的理解: 官方的讲: ThreadLocal是一个本地线程副本变量工具类,主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰 通俗的讲: ThreadLocal也叫做线程本地变量,ThreadLoacl为变量在每个线程中的都创建了副本,每个线程可以访问自己内部的副本变量,线程之间互不影响 二.TreadLocal的原理: 从上图我们可以初步窥见ThreadLocal的核心机制: 1)每个Thread线程内部都有一个Map 2)Map里面储存线…
前言 上篇文章 深入理解 Handler 消息机制 中提到了获取线程的 Looper 是通过 ThreadLocal 来实现的: public static @Nullable Looper myLooper() { return sThreadLocal.get(); } 每个线程都有自己的 Looper,它们之间不应该有任何交集,互不干扰,我们把这种变量称为 线程局部变量 .而 ThreadLocal 的作用正是存储线程局部变量,每个线程中存储的都是独立存在的数据副本.如果你还是不太理解,看…
ThreadLocal提供了线程安全的数据存储和访问方式,利用不带key的get和set方法,居然能做到线程之间隔离,非常神奇. 比如 ThreadLocal<String> threadLocal = new ThreadLocal<>(); in thread 1 //in thread1 treadLocal.set("value1"); ..... //value的值是value1 String value = threadLocal.get(); in…
老套路,先列举下关于ThreadLocal常见的疑问,希望可以通过这篇学习笔记来解决这几个问题: ThreadLocal是用来解决什么问题的? 如何使用ThreadLocal? ThreadLocal的实现原理是什么? 可否举几个实际项目中使用ThreadLocal的案例? 基础知识 ThreadLocal是线程局部变量,和普通变量的不同在于:每个线程持有这个变量的一个副本,可以独立修改(set方法)和访问(get方法)这个变量,并且线程之间不会发生冲突. 类中定义的ThreadLocal实例一…
目录结构 1.应用场景及作用 2.结构关系 2.1.三者关系类图 2.2.ThreadLocalMap结构图 2.3. 内存引用关系 2.4.存在内存泄漏原因 3.源码分析 3.1.重要代码片段 3.2.重要方法分析 3.3.set(T): void 3.4.get():T 3.5.remove():void 3.6.总结 1.应用场景及作用 -1作用.ThreadLocal 为了实现线程之间数据隔离,每个线程中有独立的变量副本,操作互不干扰.区别于线程同步中,同步在为了保证正确使用同一个共享变…
给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到一个新的数字.一直重复这样做,我们很快会停在有"数字黑洞"之称的6174,这个神奇的数字也叫Kaprekar常数. 例如,我们从6767开始,将得到 7766 - 6677 = 1089 9810 - 0189 = 9621 9621 - 1269 = 8352 8532 - 2358 = 6174 7641 - 1467 = 6174 ... ... 现给定…