当前位置:首页 > 技术 >

javathreadlocal原理(java thread 方法详解)

来源:原点资讯(www.yd166.com)时间:2023-04-15 23:23:59作者:YD166手机阅读>>

javathreadlocal原理,java thread 方法详解(1)

图解:该图基于Android中的ThreadLocal在Looper中的应用,其能够实现一个线程只有一个Looper的私有实例,左边是通过代码分析得到的类关系图,我们可以看到可以通过线程得到一个Looper,首先通过Thread里的成员变量得到ThreadLocalMap,然后通过Looper中的静态变量能够得到ThreadLocals如下代码,

javathreadlocal原理,java thread 方法详解(2)

然后通过ThreadLocals实例得到Map中的Entry然后在通过该实例得到Looper的实例,如下

javathreadlocal原理,java thread 方法详解(3)

另外,右图是在该应用中的各种类的引用关系链,通过它我们可以分析到为什么Entry引用key是用的弱引用。我们在android中有可能会用到Looper.quit简单讲就将Looper实例置为null让垃圾回收器回收。此时分析右图,可知,当Looper为null时,ThreadLocal的实例也就没有太大的用处了,也需要进行回收,但是如果Entry引用key是用的强应用,ThreadLocal的实例就不能回收,如果是弱引用的话,就可以在垃圾回收GC的时候强行回收掉。但仅仅是这样还不行,在某些情况下还是会出现问题,这就需要具体情况具体分析,下面看一个来自文章https://mp.weixin.qq.com/s/vURwBPgVuv4yGT1PeEHxZQ的例子:

javathreadlocal原理,java thread 方法详解(4)

分析该例子的引用链如下

javathreadlocal原理,java thread 方法详解(5)

TestClass的实例置null是想释放int的空间,但是不好意思,我还是能够有引用链到达int,通过Thread->Entry->TestClass->int,可能有人问TestClass实例不是置null了么,TestClass的实例t,只是线程中Thread中的一个引用置null了,也就是说thread->TestClass这条线不可达,但是Thread->Entry->TestClass->int是可达的,所以会内存泄露,与是内存溢出。解决方案是remove函数,即溢出Entry对TestClass的引用,源码如下:

private void remove(ThreadLocal<?> key) {

Entry[] tab = table;

int len = tab.length;

int i = key.threadLocalHashCode & (len-1);

for (Entry e = tab[i];

e != null;

e = tab[i = nextIndex(i, len)]) {

if (e.get() == key) {

e.clear();

expungeStaleEntry(i);

return;

}

}

}

public void clear() {

this.referent = null;

}

栏目热文

threadlocal 存在意义(threadlocal存在哪里)

threadlocal 存在意义(threadlocal存在哪里)

功能迭代,在代码层面小编有1w种实现方法(吹牛的),一起来看看这次小编如何使用ThreadLocal优雅地完成本次迭代吧...

2023-04-15 23:15:22查看全文 >>

threadlocal的底层原理(threadlocal实际中的作用)

threadlocal的底层原理(threadlocal实际中的作用)

1、ThreadLocal的底层原理图说明:Thread中有threadLocals成员变量,threadLocal会在...

2023-04-15 23:59:19查看全文 >>

threadlocal实例(threadlocal使用范例)

threadlocal实例(threadlocal使用范例)

作者:@adamhandzybuluo.com/adamhand/note/1370920ThreadLocal是什么首...

2023-04-15 23:56:45查看全文 >>

threadlocal 使用场景(threadlocal详细介绍)

threadlocal 使用场景(threadlocal详细介绍)

两大使用场景-ThreadLocal的用途典型场景1: 每个线程需要一个独享的对象(通常是工具类,典型需要使用的类有Si...

2023-04-15 23:45:51查看全文 >>

threadlocal底层原理(ThreadLocal原理)

threadlocal底层原理(ThreadLocal原理)

引言这是JWT认证条件下的getCurrentLoginUser代码实现,请分析性能:在生产环境中,currentLog...

2023-04-15 23:51:07查看全文 >>

thread local使用场景和原理

thread local使用场景和原理

是什么ThreadLocal从名字上看好像是一个Thread,其实并不是,它是Therad的局部变量的维护类。作用是让变...

2023-04-15 23:35:49查看全文 >>

柿子树风水大忌(旺宅最好的树)

柿子树风水大忌(旺宅最好的树)

“前不栽桑,后不栽柳,刀锯不上槐树身,院中不栽鬼拍手”,都是农村的一些带有迷信色彩的讲究。随着科学知识的普及,这些讲究忌...

2023-04-15 23:28:56查看全文 >>

柿子树种到院子里禁忌(柿子树栽在庭院什么位置好)

柿子树种到院子里禁忌(柿子树栽在庭院什么位置好)

提要:柿子树在院子当中种植好吗?柿子树是我国一个历史悠久的果木之一,因为柿子树所结的果实红彤彤颜色极佳,秋天成熟季节树上...

2023-04-15 23:21:05查看全文 >>

柿子最怕三句话(柿子树为什么要砍几刀)

柿子最怕三句话(柿子树为什么要砍几刀)

我国的文化博大精深,尤其是独有的俗语文化,蕴含着古人们的经验和智慧,给后人们带来了很多借鉴。俗语通过简单易懂的知识,被人...

2023-04-15 23:42:45查看全文 >>

柿子树为什么不能种在家门前(柿子树种在大门口好吗)

柿子树为什么不能种在家门前(柿子树种在大门口好吗)

明天就是3月12号植树节了,过去,风水学把一棵树归于吉祥之物,种树也需要看风水,不能乱种,种树的作用不止是遮荫纳凉、美化...

2023-04-15 23:34:55查看全文 >>

文档排行