×

threadlocal使用场景和原理

threadlocal使用场景和原理(做JAVA开发,要会什么技术)

admin admin 发表于2023-03-22 00:33:21 浏览73 评论0

抢沙发发表评论

本文目录

做JAVA开发,要会什么技术

java基础

  • Java常用的类,String、集合、IO等相关的使用及理解
  • 多线程的理解使用场景

  • String,StringBuilder,StringBuffer的区别

  • HashMap、Hashtable、ConcurrentHashMap的原理与区别

  • ThreadLocal的理解应用场景

  • 抽象类和接口

  • LinkList和ArrayList的区别

  • 重写与重载

  • 反射的理解及应用

  • Java内存模型、内存管理、堆和栈、垃圾回收

  • sql常用语法、索引,sql优化

  • java常用关键字如static、final用法作用

  • web开发理解servlet的原理及生命周期

  • jsp之九大内置对象与四大域对象等等

开发框架

Spring:

  • AOP(面向切面编程)的原理
  • AOP的使用场景
  • IOC(控制反转)的原理
  • Spring框架中的单例bean是线程安全的吗?
  • 常用的注解
  • 用到的设计模式
  • Spring的优点(解耦、很多主流框架的集成 低侵入式设计,代码的污染极低 等等)
  • SpringBean的作用域
  • 事务机制
  • Spring的核心类,及作用 如BeanFactory、ApplicationContext、BeanWrapper
  • Spring支持的ORM?
  • BeanFactory 接口和 ApplicationContext 接口有什么区别 ?
  • 依赖注入的方式有几种:接口注入、Setter注入、构造方法注入

SpringMVC:

  • 什么是Spring MVC ?简单介绍下你对springMVC的理解?
  • SpringMVC的流程?
  • Springmvc的优点
  • SpringMVC和struts2的区别有哪些?
  • 如何解决POST请求中文乱码问题,GET的又如何处理呢?

Mybatis:

  • 什么是mybatis?
  • MyBatis与Hibernate有哪些不同?
  • Mybait的优缺点
  • 常见的标签
  • 分页及常用的分页插件
  • #{}和${}的区别是什么?
  • 一对一、一对多的关联查询 ?
  • Mybatis的一级、二级缓存:
  • Mybatis比IBatis比较大的几个改进是什么?
  • IBatis和MyBatis在核心处理类分别叫什么?
  • IBatis和MyBatis在细节上的不同有哪些?
  • 为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
  • MyBatis与Hibernate有哪些不同?
SpringBoot:

  • 什么是SpringBoot
  • SpringBoot的优点
  • 常用的starter有哪些
  • Spring Boot 的配置文件有哪几种格式?它们有什么区别?
  • Spring Boot 的核心注解是哪个?常用的注解?常用的starter
  • Spring Boot 需要独立的容器运行吗?( 可以不需要,内置了 Tomcat/ Jetty 等容器。)
  • 运行 Spring Boot 有哪几种方式?
  • SpringBoot与SpringCloud的关系
  • SpringCloud的各类组件的理解及使用

Hibernate:

  • Hibernate工作原理
  • Hibernate是如何延迟加载(懒加载)?
  • 缓存机制(一级缓存、二级缓存)
  • Hibernate的查询方式有几种
  • Hibernate中save、persist和saveOrUpdate这三个方法的不同之处?
  • get()与load()的区别
  • Hibernate中的SessionFactory有什么作用? SessionFactory是线程安全的吗?

消息MQ:Kafka、RabbitMQ

版本控制工具:SVN、Git

项目管理工具:Maven、Gradle

Nginx使用,常见的liunx命令等等

总之,学无止境,坚持就是胜利

什么样的业务场景适合用多线程,请举例

首先了解下什么是多线程吧!多线程就是“人海战术”,伴随着摩尔定律的失效(单核心的计算能力不能再成倍的增长,而改为横向扩展),CPU变为了多核心的模式,而每一个CPU在同一时间能处理一个线程,也就是说同一时间线程的执行数可以为CPU核心数(超线程不讨论)!效率为以前单核心的N倍!

JAVA这门编程语言,可谓是让多线程技术变得老生常谈,那么多线程使用在什么地方呢?

1,web服务器:web服务器的请求数往往是非常大的,而且自从有了HTTP1.1之后,TCP默认是长连接模式,一般像tomcat这样的服务器会开多个线程保持与客户端的连接,所以需要多线程!

2,异步调用:比如电商平台,在主线程处理完订单等主业务之后,需要发短信,邮件等非主要的业务代码,这个时候可以新起一个线程,异步调用,而主线程可以直接返回,避免长时间的等待!

3,上传下载大文件处理:比如迅雷,如果是单线程,那么同一时候,它就只能写一个下载任务的数据,但是多线程就可以同时进行更多任务!

4,分布式计算:比如1+2+...+100000,你可以分为十个任务,然后汇总即可,比单线程可以省大约9/10的时间!

还有更多场景可以适用于多线程环境,具体问题具体分析!

但是多线程其实绝对是魔鬼,从jdk中的并发包就可见端倪,不管是synchronize,lock,threadlocal,线程池,countbatchdown,forkjoin,future,callable,valatile哪一个多线程的关键字,都可以让我们JAVA编程人员生不如死!

只能说不到万不得已,不要盲目的使用多线程,比如redis就能靠着单线程一枝独秀,linux之父Linus Tonvard说过:忘掉那该死的并发吧!可见这个多线程多么的不可取,只是如果我们JAVA程序员如果不会多线程,应该就失业了吧!

反正不管多线程有多痛苦,以后我还是会发多线程的技术分享的,敬请关注!

java开发2年,后面该如何提升自己

由于Java语言有广泛的应用场景,所以目前整个IT领域有大量的Java程序员,对于这些程序员来说,要想在开发的道路上走得更远就一定要不断提升自己的研发能力,同时不断丰富自己的知识结构。

对于具有两年开发经验的Java程序员来说,要想提升自己可以通过以下几个途径:

第一:丰富Java知识结构。Java语言由于具有广泛的应用场景,所以可以通过岗位任务来不断拓展自身的知识结构,从而具备Java全栈开发能力。从移动端(前端)到服务端再到大数据,Java语言都有对应的解决方案,而掌握这些知识结构会明显提升自身的岗位竞争力。

第二:紧跟技术发展趋势。IT行业的技术更新速度是比较快的,目前是大数据时代,与大数据关系密切的技术包括云计算、物联网、人工智能等内容都应该系统的了解一下。如果平时工作中不能接触到这些内容,那么就需要通过自主学习来完成对这些技术的掌握。另外,可以在日常的开发任务中使用一些新的技术,从而积累一定的应用经验。

第三:走研发级路线。相对于应用级程序员来说,研发级程序员的职业生命周期往往要长很多,同时成长空间也比较大,所以走研发级路线是Java程序员一个不错的选择。研发级程序员往往对于基础学科有较高的要求,尤其是数学基础,同时要具备一定的创新能力和掌握有效的研发方法,所以目前不少研发级程序员都具有研究生以上学历。因此,通过读研来完成岗位升级是不少程序员的选择,但是读研一定要趁早,越早越好。

对于大量的应用级程序员来说,在工作中积累一定的行业知识也是非常重要的,因为未来可以通过积累的行业知识和解决方案从事行业资讯工作,行业资讯专家在未来产业互联网时代将有广阔的发展空间。

我从事互联网行业多年,目前也在带计算机专业的研究生,主要的研究方向集中在大数据和人工智能领域,我会陆续写一些关于互联网技术方面的文章,感兴趣的朋友可以关注我,相信一定会有所收获。

如果有互联网方面的问题,也可以咨询我,谢谢!

如何去理解ThreadLocal

ThreadLocal是什么?

ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不通的变量值完成操作的场景.

ThreadLocal特点:就是在一个线程里放一个数据,不管中间执行了什么操作。只要想获取出来的时候,调用get就可以得到保存进去的数据.

ThreadLocal内部结构图

从上面的结构图中,我们可以看到ThreadLocal的核心机制

  • 每个Thread 内部都有一个Map。
  • Map里面存储线程本地对象(key) 和线程的变量副本(value)。
  • Thread 内部的Map是由 ThreadLocal为的,由ThreadLocal负责向map获取和设置线程的变量值。

Thread线程内部的Map在类中描述如下:

ThreadLocal 为什么会内存泄漏

我们先分析一下ThreadLocalMap

我们可以知道每个Thread 维护一个 ThreadLocalMap,这个映射表的 key 是 ThreadLocal实例本身,value 是真正需要存储的 Object,也就是说 ThreadLocal 本身并不存储值,它只是作为一个 key 来让线程从 ThreadLocalMap 获取 value。仔细观察ThreadLocalMap,这个map是使用 ThreadLocal 的弱引用作为 Key 的,弱引用的对象在 GC 时会被回收。

这样,当把threadlocal变量置为null以后,没有任何强引用指向threadlocal实例,所以threadlocal将会被gc回收。这样一来,ThreadLocalMap中就会出现key为null的Entry,就没有办法访问这些key为null的Entry的value,如果当前线程再迟迟不结束的话,这些key为null的Entry的value就会一直存在一条强引用链:Thread Ref -》 Thread -》 ThreaLocalMap -》 Entry -》 value,而这块value永远不会被访问到了,所以存在着内存泄露。

其实java 开发者,也考虑到了此问题,所以在get(),set()的时候,调用了expungeStaleEntry方法用来清除Entry中Key为null的Value,但是这是不及时的,也不是每次都会执行的,所以一些情况下还是会发生内存泄露。只有remove()方法中显式调用了expungeStaleEntry方法。

下面看下ThreadLocal 的get()方法的实现:

下面继续看 map.getEntry方法

当key 为null 时,调用getEntryAfterMiss方法

当key 为null 时,调用expungeStaleEntry 方法

也许有人会好奇,有上面方法,为什么还会导致内存泄漏呢?

  • 一般我们设置的ThreadLocal设置为static的,static 变量可以作为GCRoot的根节点,所以会一直存在
  • 初始化了ThreadLocal, 调用set ,get 而没有调用remove方法,所以会导致内存泄漏。

比如get方法,只有ThreadLocalMap中没有所需要的key时,才会调用清除方法

Java后端和Java web面试时如何展示自己非技术方面的能力

多看看基础知识点,多问自己几个为什么;只把基础掌握扎实,什么面试都不怕!!!

还记得,上大学那会儿,那时 Java 并没有现如今这么火。在网上,学 Java 一般会被 C++ 鄙视,因为他们学习 C++的小伙伴会有天生的优越感,认为 Java 不用自己管理内存,什么事情都不用你亲自管,JVM 都帮你搞定,“笨蛋”都能学会!而我当时就是哪些“笨蛋”中的一员,那个时候,就在心理默默问自己:Java 真的有那么简单吗?

这么多年过去了,自己对 Java 的认识也越来越深刻,工作中接触过很多编程语言,包括很老的 Delphi ,以及最新的 Go ,在这么多的编程语言中,我还是独爱着 Java ,也认识到任何一门语言都并非你想象的那么简单!

在我的圈子里,常有小伙伴问,为什么本来自己懂的知识点,却面试的时候回答不出来?我给的答案是,你问一下自己是否真的懂了?

你回答不出来,说明你真的没有理解透彻某个知识点,在大型互联网公司技术面试中,面试官都会从一个小的知识点作为切入点,来不断进行深挖,从而来得知你整个知识体系的深度与广度。

下面给大家分享一些我们的原创精品面试题分析文章,希望对你的面试与工作起到抛砖引玉的作用。

Java基础

  • Java 8系列之瞎说开发语言
  • Java8系列之 Lambda表达式(一)
  • Java 8系列之Lambda实践步骤(二)
  • Java 8系列之 Lambda的函数式接口(三)
  • Spring AOP之初探黄龙
  • Spring AOP之我若为王

待续中...

面试题列表

  • 面试题1解析 你真的理解Java异常吗?
  • 面试题2解析 揭开“finally”的神秘面纱
  • 面试题3解析 来,一起了解一下Java中常见字符串区别!!!
  • 面试题4解析 深度探秘String类
  • 面试题5解析 你真的懂了Java的那些修饰词吗?
  • 面试题6解析 这就是String常量池啊?
  • 面试题7解析 细谈javac编译器
  • 面试题8解析 JVM到底怎么进行类加载器的呢?
  • 面试题9解析 线程到底是怎么回事
  • 面试题10解析 怎么唤醒线程呢,你真的会用吗?
  • 面试题11解析 线程和进程到底怎么区分?
  • 面试题12解析-多线程之间的协调示例
  • 面试题13解析-CAS与ABA
  • 面试题14解析-ThreadLocal原理、应用场景及内存泄漏
  • 面试题15-守护线程
  • 面试16解析-深挖锁(上)
  • 面试题16解析-深挖锁(下)
  • 深挖锁(补充篇)
  • 面试17解析-死锁
  • 面试题18解析-同步容器
  • 面试题19解析-线程池(上)
  • 面试题19解析-线程池(下)
  • 面试题20解析-Executor框架(上)
  • 面试题20解析-Executor框架(下)
  • 面试题21解析-浏览器背后的秘密
  • 面试题22解析-CDN分析
  • Java Socket与TCP/IP协议栈
  • 面试题24解析-详谈DNS域名解析过程
  • 以Java的视角来聊聊BIO、NIO与AIO的区别?

待续中...

面试经验分享

这是咱们圈子里面试成功的小伙伴分享的面试经历,也许对你有帮助。

  • 成都的互联网大厂,你知道几个?
  • 圈内小伙伴美团点评校招面试经验分享
  • 圈内小伙伴(非科班)的秋招面试经历分享
  • 圈内小伙伴百度(实习)面试经历分享

待续中...

安全防御

作为一个开发人员应该懂得的安全知识,希望能够帮助你在工作中写出更健壮的代码。

  • Google应该这样玩,你知道这些技巧吗?
  • “暗网”背后的秘密
  • 以Java的视角来聊聊SQL注入
  • 你的 Java web 配置安全吗?
  • 站在Java的视角,深度分析防不胜防的小偷——“XSS”
  • 一起来学习用JNI加固你的Java代码,文末有彩蛋哦

待续中...

忠言逆耳:重视基础;重视基础;重视基础;重要的话说三遍。学技术不是为了炫技,而是实实在在的解决问题。