10-Spring_JMM-1

本文深入探讨了Java并发编程中的核心概念,包括synchronized关键字的使用及注意事项、死锁现象的产生原因、ThreadLocal类的功能及其内存泄漏问题,并介绍了不同类型的Java引用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

还是用中文来写比价合适。。。又没有英语环境,自己写的词汇,句子,全部都是自己瞎编的=。=

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

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值