Java之并发编程基础

目录

一、什么是并发?

二、什么是并行?

三、并发与并行的区别?

四、线程与进程的区别?

五、线程的生命周期?

六、在编程中高并发会产生什么问题,发生并发问题的条件是什么?

        1)高并发场景下容易产生的问题:

         2)产生并发问题的条件:

         3)产生死锁的条件?

                1. 互斥(Mutual Exclusion)

                2. 占有且等待(Hold and Wait)

                3. 非抢占(No Preemption)

                4. 循环等待(Circular Wait)

                4)如何能尽量预防和避免死锁?

七、Java中如何在高并发的情况下保证数据的安全?

                1)使用线程安全的数据结构

                2)使用同步机制

                3)使用原子变量

                4)避免长时间持有锁

                5)使用读写锁

                6)使用线程池


一、什么是并发?

        并发指的是系统中多个任务(线程)在同一时间段内交替执行。它允许多个任务在逻辑上同时进行,但在实际的单核处理器上,这些任务是通过时间分片的方式交替执行的。

二、什么是并行?

        并行指的是在同一时刻有多个任务在不同的处理器核上同时执行。它利用多核处理器的能力来同时执行多个任务,以提高执行效率。

三、并发与并行的区别?

                并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果

                并行(parallel):指在同一时刻有多条指令在多个处理器上同时执行

                来个比喻:并发是一个人同时吃三个馒头,而并行是三个人同时吃三个馒头。

四、线程与进程的区别?

                进程:进程是系统中正在运行的一个程序,程序一旦运行就是进程。

                线程:一个进程可以拥有多个线程,线程是进程的一个特定执行路径。

五、线程的生命周期?

                 新建->就绪->运行->阻塞->死亡

        

六、在编程中高并发会产生什么问题,发生并发问题的条件是什么?

        1)高并发场景下容易产生的问题:

  1. 数据竞争(Data Race): 当多个线程同时访问和修改共享数据,而没有适当的同步机制时,可能会导致数据竞争。这会导致数据的不一致性和难以预测的行为。
  2. 原子性问题: 如果一个操作由多个步骤组成,在高并发环境中这些步骤可能被其他线程打断,从而导致操作的结果不正确。
  3. 可见性问题: 一个线程对共享变量的修改可能对其他线程不可见,导致读取到过时的数据。即使一个线程修改了数据,其他线程可能仍然读取到旧值。
  4. 死锁(Deadlock): 当多个线程在等待对方持有的资源时,可能会导致死锁。死锁会导致线程无法继续执行,系统资源被锁定。
  5. 活锁(Livelock): 类似于死锁,但线程会继续改变状态来避免死锁,而实际上永远无法完成任务。线程处于不断的状态改变中,无法继续向前执行。

         2)产生并发问题的条件:

  1. 多线程环境
  2. 共享资源且对共享资源有修改行为
  3. 缺乏同步机制
  4. 不适当的锁策略

         3)产生死锁的条件?

                1. 互斥(Mutual Exclusion)

                        定义: 互斥条件指的是至少有一个资源必须被持有且不能被其他线程使用,即资源在同一时刻只能被一个线程占有。如果其他线程想要使用这个资源,它们必须等待。

                        示例: 只有一个线程可以持有一个锁,而其他线程必须等待这个锁被释放。

                2. 占有且等待(Hold and Wait)

                        定义: 占有且等待条件指的是一个线程持有至少一个资源,并且在等待获取其他资源时不会释放它已经持有的资源。

                        示例: 一个线程已经持有锁A,并且在等待锁B的同时不释放锁A。

                3. 非抢占(No Preemption)

                        定义: 非抢占条件指的是资源不能被强制从持有者手中夺走,资源只能由持有者在完成任务后自行释放。

                        示例: 如果线程持有某个资源,系统不会强制将资源从线程中抢占出来,而是需要线程自愿释放。

                4. 循环等待(Circular Wait)

                        定义: 循环等待条件指的是存在一个线程集合,其中每个线程都在等待下一个线程持有的资源,形成一个循环。

                        示例: 线程A等待线程B持有的资源,线程B等待线程C持有的资源,线程C等待线程A持有的资源,形成一个闭环。

                4)如何能尽量预防和避免死锁?

  1. 避免条件:通过资源排序和锁定顺序避免循环等待。
  2. 资源分配策略:一次性请求所有资源,或使用尝试锁定机制。
  3. 死锁检测与恢复:检测死锁并采取恢复措施,如终止线程或回滚操作。
  4. 合适的锁策略:控制锁粒度、使用读写锁来提高并发性能。
  5. 无锁编程:使用原子变量实现无锁的并发操作。
  6. 合理使用线程池:优化线程池配置和任务队列。

七、Java中如何在高并发的情况下保证数据的安全?

                1)使用线程安全的数据结构

                2)使用同步机制

                3)使用原子变量

                4)避免长时间持有锁

                5)使用读写锁

                6)使用线程池

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值