Java基础面试-多线程

对线程安全的理解

不是线程安全,应该是内存安全,堆是共享内存,可以被所有线程访问

和单线程执行的结果一样,就是线程安全的

栈:每个线程相互独立,保证代码执行顺序

堆:每个进程会被分配独立的内存空间,里面有一块堆内存,进程内的所有线程都可以访问到这块堆内存,这就是造成线程安全问题的潜在原因

守护线程

守护线程:为所有非守护线程提供服务的线程,任何一个守护线程都是整个IVM中所有非守护线程的保姆;

守护线程类似于整个进程的一个默默无闻的小喽喽;它的生死无关重要,它却依赖整个进程而运行;哪天其他线程结束了,没有要执行的了,程序就结束了,理都没理守护线程,就把它中断了;

注意:由于守护线程的终止是自身无法控制的,因此千万不要把io、File等重要操作逻辑分配给它;因为它不靠谱;

守护线程的作用是什么?

举例,GC垃圾回收线程:就是一个经典的守护线程,当我们的程序中不再有任何运行的Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是JVM上仅剩的线程时,垃圾回收线程会自动离开。它始终在低级别的状态中运行,用于实时监控和管理系统中的可回收资源。

应用场景:

(1)来为其它线程提供服务支持的情况,

(2) 或者在任何情况下,程序结束时,这个线程必须正常且立刻关闭,就可以作为守护线程来使用,反之,如果一个正在执行某个操作的线程必须要正确地关闭掉否则就会出现不好的后果的话,那么这个线程就不能是守护线程,而是用户线程。通常都是些关键的事务,比方说,数据库录入或者更新,这些操作都是不能中断的。

thread.setDaemon(true)必须在thread.start0之前设置,否则会跑出一个llegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程。

在Daemon线程中产生的新线程也是Daemon的。

相关推荐
没有bug.的程序员1 分钟前
Gradle 构建优化深度探秘:从 Java 核心到底层 Android 物理性能压榨实战指南
android·java·开发语言·分布式·缓存·gradle
宇木灵20 分钟前
C语言基础学习-X0前置
c语言·开发语言·学习
-Rane26 分钟前
【C++】vector
开发语言·c++·算法
电饭叔31 分钟前
python转换字符串介绍
开发语言·windows·python
tianyagukechat34 分钟前
rockylinux9.5 配置IP
java·网络·tcp/ip
希望之晨35 分钟前
c++ 11 学习 override
开发语言·c++·学习
程序员Sonder42 分钟前
黑马java----正则表达式(一文弄懂)
java·正则表达式·新人首发
doris820443 分钟前
Python 正则表达式 re.findall()
java·python·正则表达式
Mrliu__1 小时前
Python高级技巧(六):正则表达式
开发语言·python·正则表达式
普通网友1 小时前
PL/SQL语言的正则表达式
开发语言·后端·golang