还是用中文来写比价合适。。。又没有英语环境,自己写的词汇,句子,全部都是自己瞎编的=。=
1.synchronized
非静态this锁:
首先这是一个内置锁,说一下2个常见的用法:
在方法名前面加,和写一个代码块:
1.写在方法名前面,这个时候分为静态方发锁,和非静态方法锁
2.再自己写一个块: synchronized(全局变量obj){
}
这里有一点要注意,非静态的方发锁,自然是给对象调用的,非静态方法的这个对象是this,那么这个锁
也就叫做this锁
非静态方法锁 = synchronized(this){
}
他们都叫this锁,之前在java的基础学习里面,提到过,静态方法是不可以调用非静态变量,这里依然是如此
但是,如果代码块synchronized(obj){
}
这个时候,非静态方法的锁,跟这个代码块的锁,是不一样的。是2个不同对象
关于这个内置锁,有一个值得注意的地方,如果在嵌套锁的时候,比如你的线程A
A --> 锁A --> 锁B --> 锁A
那么,其实A还是只上了1把A锁,和一把B锁,也就是说,所有的线程阿,只能上一次 同样的一把锁
还有一点值得注意的是,如果是2个对象,2个线程,分别跑的时候,自然是不冲突的,因为这是非静态锁
一个对象,就一把锁,两个对象自然就是2把
静态锁:
加了static关键字的,在内存中,给你分配的是称之为方法区的内存
在这里,静态方法锁,有点类似oc里面的+方法,这里的调用者自然就是类,这个静态方法锁,不管你创建多少分对象
自然只可能有一个,这里可以帮助解决线程安全问题,当然,代码块也可以是静态的
但是这里的静态代码块要写到:
synchronized(.class){
}
或者
synchronized(this.getClass()){
}
这里的静态方法,调用者自然就是这个类,很容易懂
2.死锁
锁嵌套锁
当出现有2个线程,然后每个线程有2个以上的锁发生嵌套的时候,互相开不了对方的锁,导致死锁
3.Threadlocal
详解这个类
局部变量在函数内部使用,全局变量在类中定义。
而Threadlocal则是规定了一个生命周期为某个线程的一个变量,这种变量就是Threadlocal
特点:
跨函数,跨哪些函数,跨哪些函数,是由线程来决定的
所以,这个变量就是归某线程独立使用的,并不是线程共享的.
这里还必须补充一下java的引用Reference知识:
Java Ref:
1.强引用:用new关键字生产一个变量,就是强引用
2.弱引用:如果一个对象,指向它的全部都是弱引用,那么java回收器,就会判定这个对象是finalizable,
也就是说这个对象是会被回收的
3.软引用:其对比的是弱引用,弱引用是无论内存是否充足,一定会被回收,但是软应用,在内存充足的情况下
是不会被回收的
4.虚引用:暂时不讲这个
以上的这些引用,使用场景不多,关于弱引用的使用,暂时不需要了解.
关于Threadlocal的内存泄漏问题.这是一个坑:
用通俗易懂的话来讲一下吧:
Threadlocal变量,其底层是用到了Map对象,调Threadlocal使用的key是Threadlocal调的
但是Threadlocal调用这个map里面的entry对象,万一Threadlocal被回收了,那么这个entry就没有人
可以去调用了,这样就内存泄漏了.
避免Threadlocal内存泄露的方式:
1.遍历擦除key为null的entry
2.把Threadlocal设置为private static的,防止其被回收
Quote:
https://www.cnblogs.com/xzwblog/p/7227509.html