本文已参与「新人创作礼」活动,一起开启掘金创作之路。
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和非静态同步方法,是不受影响,同时进行的