美团Java研发岗二面:什么叫线程安全?servlet是线程安全吗?

简介: 再过一个月的时间就是金九银十了,相信不少的朋友对于已经做好了充足的准备来应对这一次春招,小编对大家也没有太多的建议和帮助,分享一些你们面试上面可以用得到的一些面试题。今天主要给大家分享多线程(线程安全)方面的面试题,看到文章的小伙伴一定要看到后面哦,有海量的面试题分享给大家哟。

前言:

再过一个月的时间就是金九银十了,相信不少的朋友对于已经做好了充足的准备来应对这一次春招,小编对大家也没有太多的建议和帮助,分享一些你们面试上面可以用得到的一些面试题。今天主要给大家分享多线程(线程安全)方面的面试题,看到文章的小伙伴一定要看到后面哦,有海量的面试题分享给大家哟。

1、什么叫线程安全?servlet是线程安全吗?

线程安全 就是多线程在运行期间不会产生不符合常规的数据。

同样在多线程访问同一代码,不会产生不确定的结果

线程安全首先呢他的是多线程,至少是2个。因为一个线程那肯定是线程安全的。就你自己一个线程执行没有人给你争用资源。你是在串行执行,不会出现不确定结果。 如果有多个线程 那问题可就多了。比如一个 ArrayList 类,在添加一个元素的时候,它可能会有两步来完成:

1. 在 Items[Size] 的位置存放此元素;

2. 增大 Size 的值。

线程A完成第一步时,被CPU暂停了。此时Size值还是原来的值线程B并不知情,又跑到线程A刚才放元素的位置又放了一遍,然后Size+1。紧接着A也被唤醒了,也去Size+1 这时候Size = 2了,但是只有一个元素。虽然放了两次放到了同样的位置上覆盖了。

怎么解决这个问题?可以好好思考一下

1、把操作设置成原子操作,哥执行的时候不被别人打扰。

2、让修改过的值实时告知给其他线程。

3、还有我继续想~

Servlet是线程不安全的

2、同步有几种实现方法?

同步有两种方法 分别是synchronized wait与notify

3、请说明下java的内存模型及其工作流程。

Java内存模型就是 java内存分为主内存和工作内存

多线程 每一个线程都会有一个自己的工作内存,所使用到的变量都是主内存的一份拷贝。

4、volatile有什么用?能否用一句话说明下volatile的应用场景?

Volatile 的作用就是多线程使用同一个变量时,每次都去主内存去读。保障了数据的实时性。 应用场景就是多线程 操作同一个变量。

5、多线程执行怎么保障变量的可见性?

可见性:就是一个线程修改了变量,其他线程可以立即知道

保证可见性的方法

volatile

synchronized (unlock之前,写变量值回主存)

final(一旦初始化完成,其他线程就可见)

6、为什么代码会重排序?

代码重排序是为了CPU的高效率执行。

JVM指令重排的基本原则

  • 程序顺序原则:一个线程内保证语义的串行性
  • volatile规则:volatile变量的写,先发生于读
  • 锁规则:解锁(unlock)必然发生在随后的加锁(lock)前
  • 传递性:A先于B,B先于C 那么A必然先于C
  • 线程的start方法先于它的每一个动作
  • 线程的所有操作先于线程的终结(Thread.join())
  • 线程的中断(interrupt())先于被中断线程的代码
  • 对象的构造函数执行结束先于finalize()方法

关于JAVA 多线程并发知识点总结(思维导图)


总结:

Java多线程一直是大厂面试考察的一个重点,上面给大家展示的是一部分学习路线,由于文章的长度限制,没有将所有的答案都给大家分享出来,除了Java多线程,小编还整理了有微服务,开源框架,并发编程,分布式专题,有需要的朋友可以点击此处获取



相关文章
|
6天前
|
安全 Java 调度
Java编程时多线程操作单核服务器可以不加锁吗?
Java编程时多线程操作单核服务器可以不加锁吗?
21 2
|
8天前
|
Java 调度
Java-Thread多线程的使用
这篇文章介绍了Java中Thread类多线程的创建、使用、生命周期、状态以及线程同步和死锁的概念和处理方法。
Java-Thread多线程的使用
|
6天前
|
Java 数据中心 微服务
Java高级知识:线程池隔离与信号量隔离的实战应用
在Java并发编程中,线程池隔离与信号量隔离是两种常用的资源隔离技术,它们在提高系统稳定性、防止系统过载方面发挥着重要作用。
6 0
|
8天前
|
Java 数据处理 调度
Java中的多线程编程:从基础到实践
本文深入探讨了Java中多线程编程的基本概念、实现方式及其在实际项目中的应用。首先,我们将了解什么是线程以及为何需要多线程编程。接着,文章将详细介绍如何在Java中创建和管理线程,包括继承Thread类、实现Runnable接口以及使用Executor框架等方法。此外,我们还将讨论线程同步和通信的问题,如互斥锁、信号量、条件变量等。最后,通过具体的示例展示了如何在实际项目中有效地利用多线程提高程序的性能和响应能力。
|
9天前
|
安全 算法 Java
Java中的多线程编程:从基础到高级应用
本文深入探讨了Java中的多线程编程,从最基础的概念入手,逐步引导读者了解并掌握多线程开发的核心技术。无论是初学者还是有一定经验的开发者,都能从中获益。通过实例和代码示例,本文详细讲解了线程的创建与管理、同步与锁机制、线程间通信以及高级并发工具等主题。此外,还讨论了多线程编程中常见的问题及其解决方案,帮助读者编写出高效、安全的多线程应用程序。
|
2月前
|
存储 监控 Java
Java多线程优化:提高线程池性能的技巧与实践
Java多线程优化:提高线程池性能的技巧与实践
64 1
|
6天前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
14天前
|
Java Spring
spring多线程实现+合理设置最大线程数和核心线程数
本文介绍了手动设置线程池时的最大线程数和核心线程数配置方法,建议根据CPU核数及程序类型(CPU密集型或IO密集型)来合理设定。对于IO密集型,核心线程数设为CPU核数的两倍;CPU密集型则设为CPU核数加一。此外,还讨论了`maxPoolSize`、`keepAliveTime`、`allowCoreThreadTimeout`和`queueCapacity`等参数的设置策略,以确保线程池高效稳定运行。
77 10
spring多线程实现+合理设置最大线程数和核心线程数
|
22天前
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android多线程编程的重要性及其实现方法,涵盖了基本概念、常见线程类型(如主线程、工作线程)以及多种多线程实现方式(如`Thread`、`HandlerThread`、`Executors`、Kotlin协程等)。通过合理的多线程管理,可大幅提升应用性能和用户体验。
39 15
一个Android App最少有几个线程?实现多线程的方式有哪些?
|
8天前
|
Python
5-5|python开启多线程入口必须在main,从python线程(而不是main线程)启动pyQt线程有什么坏处?...
5-5|python开启多线程入口必须在main,从python线程(而不是main线程)启动pyQt线程有什么坏处?...
下一篇
无影云桌面