所有分类
  • 所有分类
  • 未分类

Java多线程-基础知识

简介

本文介绍Java多线程的基础知识。包括:多线程同步的实现方式,死锁产生的条件,如何避免死锁。

多线程同步的方案

方式优点缺点使用场景
synchronized使用简单;CPU占用低响应缓慢(并发性能差);不灵活。并发量低;大的代码块 同步方法/代码块
并发集合(List, Map) 例:ConcurrentHashMap等并发性能高
java.util.concurrent.locks.*
(锁)
并发性能高;灵活CPU占用高(CAS通病);需手动加锁、释放锁例如:可重入锁(ReentrantLock)
java.util.concurrent.atomic.*
(原子变量)
并发性能高(比locks还高)只能锁一个变量可升级为原子变量队列
ThreadLocal
wait(),notify() 
(等待与唤醒)
java.util.concurrent.BlockingQueue
(阻塞队列)

死锁

死锁产生的条件

  1. 互斥条件
    1. 指线程对己经获取到的资源进行排它性使用,即该资源同时只由一个线程占用。如果此时还有其他线程请求获取该资源,则请求者只能等待,直至占有资源的线程释放该资源。
  2. 请求并持有条件
    1. 指一个线程己经持有了至少一个资源,但又提出了新的资源请求,而新资源己被其他线程占有,所以当前线程会被阻塞,但阻塞的同时并不释放自己己经获取的资源。
  3. 不可剥夺条件
    1. 指线程获取到的资源在自己使用完之前不能被其他线程抢占,只有在自己使用完毕后才由自己释放该资源。
  4. 环路等待条件
    1. 指在发生死锁时,必然存在一个线程一资源的环形链,即线程集合{T0, Tl, T2,…,Tn}中的T0正在等待一个T1占用的资源,T1正在等待T2占用的资源,……Tn正在等待己被T0占用的资源。

如何避免死锁

要避免死锁,只需要破坏掉至少一个构造死锁的必要条件即可,但是学过操作系统的读者应该都知道, 目前只有请求并持有和环路等待条件是可以被破坏的

4

评论4

请先

  1. 破坏的具体方法在面试的时候不会往下问吗?
    WinterStars 2024-05-20 0
    • 这个一般不会再往下问。如果问,会结合MySQL的死锁等实际问题来问:https://way2j.com/a/641
      自学精灵 2024-05-20 0
  2. 互斥条件和不可剥夺条件感觉写的有点模糊,分不清概念
    150003 2024-04-26 0
    • 互斥:只能被一个线程持有。不可剥夺:不能被抢走。这不好理解?
      自学精灵 2024-04-26 1
显示验证码
没有账号?注册  忘记密码?

社交账号快速登录