面试难题,不用ThreadLocal 程序会崩吗?
Posted Java思维导图
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试难题,不用ThreadLocal 程序会崩吗?相关的知识,希望对你有一定的参考价值。
这个问题我疑问了很久很久,主要如下截图。
个连接对应一个事务,多个连接的事务是不一样的,先大概了解一下,往下看????
本人是在学threadlocal的时候,网上大部分人都是说数据库连接池是典型的用了threadloca的例子,然后我就又查数据库连接池和threadloca的关系,但是,99%都说threadlocal是为了在并发的情况下,为了保证线程安全,创建了副本什么的,其实这只是threadlocal的用法之一,它还有个用法就是确保同一线程之间参数传递的方便(扯远了)
回归正题,还是拿上面的图来说事。。。。
我只讲两个关键点,明白人一看就懂:
1、两者有根本性的区别,用处不一样!
而ThreadLocal缓存连接,是为了把同一个数据库连接“分享”给同一个线程的不同调用方法。(不管调用哪个方法,都是使用的同一个连接,方便进行“跨方法”的事务控制)
2、重点要理解“连接池”。
java.sql.DriverManager.getConnection(url, props);
java.sql.Driver.connect(url, props);
PS:所以说:使用数据库连接池时,还是要显式的调用数据库连接池API提供的关闭连接的方法。
理解一下这句话:
不同的线程在同一个时间( 或者 同一个线程在多个地方)从连接池中拿到的Connection,肯定不是同一个连接。(反过来讲:不同时间的两个线程,一前一后,则有可能拿到同一个连接)
总结:
1、首先,我们为了避免单一数据库连接的创建和关闭耗费时间和性能,引入了数据库连接池,提前创建好了n条连接放入池中,如果是单线程情况下,那这样挺好的
2、那如果是多线程情况下呢?还是上面那段话,假设同一时间多个线程从数据库连接池获取连接,那肯定拿的是不同的连接,我当前线程和别的线程拿的连接不一样,那我当前在crud的时候,不在一个事务之内。
来源:http://mtw.so/5uzL9h
以上是关于面试难题,不用ThreadLocal 程序会崩吗?的主要内容,如果未能解决你的问题,请参考以下文章
面试题2020-03-31说说你对ThreadLocal的理解
面试官问我:ThreadLocal的原理是什么,Looper对象为什么要存在ThreadLocal中?