spring boot 单例 多线程 知识点

486 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1. spring boot 创建的bean是单例的还是多例的?

单例的,要不然controller类中的非静态变量如何保证是线程安全的

2. 为什么spring要默认是单例呢?

为了性能:单例就不用每次new了

节省资源,因为它控制了实例对象的个数,并有利于gc回收。

其次也不需要多例

因此不要在controller等bean中定义成员变量

3. 服务器多线程?

服务器是多线程的,为每个用户开辟一个线程,每个用户访问服务器,会创建一个request

4. spring单例模式?

spring单例模式是指,在内存中只实例化一个类的对象

5. 局部变量与成员变量?

局部变量不会受多线程影响,成员变量会受到多线程影响

6. JVM是如何实现线程的独立内存空间?

Java中的栈

1、每当启用一个线程时,JVM就为他分配一个Java栈,栈是以帧为单位保存当前线程的运行状态。某个线程正在执行的方法称为当前方法,当前方法使用的栈帧称为当前帧,当前方法所属的类称为当前类,当前类的常量池称为当前常量池。当线程执行一个方法时,它会跟踪当前常量池。

2、每当线程调用一个Java方法时,JVM就会在该线程对应的栈中压入一个帧,这个帧自然就成了当前帧。当执行这个方法时,它使用这个帧来存储参数、局部变量、中间运算结果等等。

3、Java栈上的所有数据都是私有的。任何线程都不能访问另一个线程的栈数据。所以我们不用考虑多线程情况下栈数据访问同步的情况

7. Servlet是单实例多线程

8. 多线程安全问题

多线程安全问题:

多线程访问同一资源(同一对象、同一变量...),出现的不同的结果

容易出现多线程安全问题:

线程安全问题大多是由全局变量及静态变量引起的,局部变量逃逸也可能导致线程安全问题。

若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;

若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。

9. 线程同步作用:

线程有可能和其他线程共享一些资源,比如,内存,文件,数据库等。

当多个线程同时读写同一份共享资源的时候,可能会引起冲突。这时候,我们需要引入线程“同步”机制,即各位线程之间要有个先来后到,不能一窝蜂挤上去抢作一团。

线程同步==“排队”

10. 并发与并行

网上找到的一个很好的例子:

你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。 你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。 你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。

并发的关键是你有处理多个任务的能力,不一定要同时。 并行的关键是你有同时处理多个任务的能力。

11. 线程安全与线程不安全

concurrenthashmap、Vector、HashTable、Properties是线程安全的;

ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等都是线程不安全的。

注:进行写操作时才会出现线程不安全

12. synchronized

能够保证在同一时刻最多只有一个线程执行该段代码,易达到保证并发安全的效果

同时访问同步方法和非同步方法,非同步方法不会因为同步方法而受影响

同时访问同一个对象的2个同步方法,是会受影响的,即是串行执行的

同时访问静态synchronized和非静态同步方法,是不受影响,同时进行的