美文网首页
Java ThreadLocal

Java ThreadLocal

作者: 攻城狮托马斯 | 来源:发表于2020-05-13 16:19 被阅读0次

错误地加锁


Integer x = new Integer(5)

Object ob = new Object();

synchronize(x)

x++;

这样的操作会导致线程不安全,因为x++中new了一个新的object,因此锁住的不再是x object.

解决的方法可以创立一个object专门拿来被锁,然后对x进行操作.

ThreadLocal()


在Thread中存一个数据的副本,做到真正的数据隔离。

每一个Thread都会有一个ThreadLocalMap<ThreadLocal, Generics>(), 因此,需要数据的时候get, 更改数据的时候set, 其他线程并不会对这个数据的值产生影响。

get的时候,会先找到目前的thread,然后获取threadLocalMap, 然后根据threadLocal来获取值.

set也是类似的道理。

强软弱虚引用


强引用:不会被回收

软引用:在内存足够情况下不会被回收

弱引用:一定会被回收

虚引用:一定被回收

ThreadLocal()内存泄漏


通常,一个线程完成运行后,在heap中new出的对象就会被标记然后回收, 而因为threadLocal通常都是private static的,因此除非类被删除,通常是不会被删除的。

1.threadLocal threadLocalOne指针 指向 heap中的 threadLocal的实体是强引用,而threadLocalMap的key中指向threadLocal是弱引用。因此,如果把指针设为null, 断开对heap中threadLocal的强引用, 那么threadLocal(因为是弱引用) 就会被删除, 而threadLocalMap中就会留下一堆Entry<null, generics>, get方法虽然会删除掉一些键为null的entry,可是还是会有一些永远得不到key的entry留下来,造成垃圾泄漏。

2.那么如果把Entry中的key强引用指向heap中threadLocal的object呢,

这样的话, threadLocal由于被强引用指着,在被设置成null的时候就没有被删除.

ThreadLocal()线程不安全


public static Number num = new Number(0);

public static threadLocal<Number> value = new ThreadLocal<Number>();

如果threadLocal存的是相对应的属于class 的static number, 那么在每个线程中的threadLocalMap中储存的都是同一个Number对象,会产生线程不安全的情况.

线程共享


多个线程对读取同一个变量, synchronize, volatile, 之前都写过了

线程之间的协作


wait(), notify()/notifyAll(), 这些操作都属于Object()而不是Thread Class().在某个对象上等待通知

所有的wait(), notify()/ notifyAll()的操作都要建立在拿锁的基础上, syn(对象)

范式:

等待:

synchronize(object) {

    while(条件不满足) {

        object.wait()// 目前线程进入休眠/切换任务前, 把对此object的锁释放掉

                        //直到线程得到通知,并再去争抢这个object的锁

}

//业务逻辑

}

-----------------------------------------------

通知:

syn(object) {

//业务逻辑

object.notify/notifyall()//放在最后一行,并不会释放对这一object的锁

}

//当逻辑结束后, 释放object的锁

--------------------------------------------------

notify() vs. notifyAll()

notify()只通知任意一个等待线程(可能这个线程不是为了此业务逻辑的),而notifyAll()会唤醒所有线程, 而能抢到锁且满足条件的线程就可以开始工作. 因此, 尽量要用notifyAll();

为什么wait释放而notify上锁?

Java规定.

相关文章

网友评论

      本文标题:Java ThreadLocal

      本文链接:https://www.haomeiwen.com/subject/lqoinhtx.html