多线程相关-1

java多线程相关问题

1.线程和进程的区别

进程是正在运行的程序,是操作系统资源分配和调度的独立单位,一个进程至少拥有一个线程
线程是CPU调度的基本单位
区别:
地址空间:进程拥有独立的地址空间,线程共享进程的地址空间
资源:进程拥有独立的资源,线程共享进程的资源
独立性:进程拥有独立的地址空间和资源,因此运行互不影响,线程共享进程的资源和地址空间,当一个线程崩溃时可能会导致其他线程也崩溃
创建销毁开销:进程的创建销毁涉及资源的分配和回收,因此开销较大,线程共享进程资源,因此创建和销毁开销较小
上下文切换:由于线程共享进程资源和空间,因此线程上下文切换比进程要快
通信方式:进程之间互不影响,需要通过管道、共享内存、信号等方法进行通信,而线程通过共享进程内存进行通信,不需要额外的机制

2.什么是上下文切换?它在多任务操作系统中扮演什么角色?

上下文切换是操作系统保存当前进程或线程的执行状态,并恢复另一个进程或线程的执行状态的过程。它是多任务操作系统中实现任务切换的关键机制,允许多个任务在同一个CPU上交替执行,从而创建了并发执行的假象。

3.线程同步和进程同步有什么区别?为什么说线程同步比进程同步更高效?

线程同步是在同一个进程内部,不同线程之间协调对共享资源的访问。进程同步则涉及到不同进程之间的协调。
线程同步比进程同步更高效,因为:
资源共享:线程共享相同的内存空间,而进程间通信需要额外的IPC机制。
开销:线程间的上下文切换比进程间的上下文切换开销小。
通信:线程间的通信不需要复杂的IPC,可以直接通过共享内存进行。

4.多线程和多进程适用场景

多进程适用于不同的进程执行不同的任务,需要更严格的隔离;而多线程适用于任务之间的资源共享更频繁,且对实时性要求更高的场景

5.创建线程的方式:

1.继承Thread类
继承Tread类,重写run方法,创建对象,调用start方法
2.实现Runable接口
实现Runable接口,重写run方法,创建对象,创建Thread对象时将接口实现类对象作为构造参数,调用start方法

6.两种方式区别

实现Runable接口,线程类还可以继承其他类,更加灵活,但在使用时需要使用Thread类包装,使用稍微麻烦一点。

继承Thread类,线程类不可再继承其他类,使用较为简单,直接new对象调用start方法即可。
若只是想实现一个线程类,依照单一职责原则,应该选择实现Runable接口,该接口职责为创建线程类,而Thread类是用来管理线程的生命周期的,实现Thread类会继承它所有的方法和属性,没有必要。

7.实现线程安全的方式

Synchronized关键字,锁住方法或者代码块,同一时间只能有一个线程访问方法或者代码块
ReentrantLock tryLock()获取锁,在锁释放前的代码块同时只有一个线程执行,unlock方法释放锁
volatile 修饰变量,当线程对其进行修改时,同步更新到内存,且所有线程持有的变量副本无效,需要重新读取
原子变量 java.concurrent.automic包中提供了创建原子变量的工具类

8.什么是原子操作?为什么在多线程编程中原子操作很重要?

原子操作是指在多线程环境下,一个操作在执行过程中不会被其他线程中断,它要么完全执行,要么完全不执行,不存在中间状态。

原子操作在多线程编程中很重要,因为:
线程安全:确保在并发环境中,对共享资源的操作是安全的。
避免竞态条件:防止因多个线程并发访问共享资源而导致数据不一致的问题。
提高效率:相比于使用锁,原子操作通常具有更高的性能,减少了线程间的上下文切换和潜在的阻塞。
在多线程编程中,正确地使用原子操作对于构建高效、可靠和可维护的并发应用程序至关重要。

9.八大原子操作:CPU无法中断的操作

八大原子操作包括lock(锁定)、unlock(解锁)、read(读取)、load(载入)、use(使用)、assign(赋值)、store(存储)和write(写入)。这些操作在Java内存模型(JMM)中定义,用于规范线程与主内存之间的交互。具体说明如下:

lock(锁定)。此操作将主内存中的变量加锁,标记为线程独占状态,防止其他线程访问。23
unlock(解锁)。此操作释放lock加锁的变量的锁定状态,允许其他线程访问该变量。
read(读取)。此操作从主内存中读取变量的值到线程的工作内存中,为后续的load操作做准备。
load(载入)。此操作将read操作读取到的变量值放入工作内存的变量副本中。
use(使用)。此操作将工作内存中变量的值传递给执行引擎,以便执行相关的字节码指令。
assign(赋值)。此操作将执行引擎处理后的值重新赋值给工作内存中的变量。
store(存储)。此操作将工作内存中变量的值传送到主内存中,为随后的write操作做准备。
write(写入)。此操作将store操作从工作内存中得到的变量的值放入主内存的变量中,更新主存。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值