多线程学习1.1

关于多线程的学习1.1

对于线程同步机制的学习

synchronized关键字学习

  • synchronized锁的对象就是变化的量,需要增删改查的对象

死锁学习

  • 认识线程死锁

线程死锁描述的是这样⼀种情况:多个线程同时被阻塞,它们中的⼀个或者全部都在等待某个资源被释放。由于线程被⽆限期地阻塞,因此程序不可能正常终⽌。
如下图所示,线程 A 持有资源 2,线程 B 持有资源 1,他们同时都想申请对⽅的资源,所以这两个线程就会互相等待⽽进⼊死锁状态。

  • 产⽣死锁必须具备以下四个条件:
  1. 互斥条件:该资源任意⼀个时刻只由⼀个线程占⽤。
  2. 请求与保持条件:⼀个进程因请求资源⽽阻塞时,对已获得的资源保持不放。
  3. 不剥夺条件:线程已获得的资源在末使⽤完之前不能被其他线程强⾏剥夺,只有⾃⼰使⽤完毕后才释放资源。
  4. 循环等待条件:若⼲进程之间形成⼀种头尾相接的循环等待资源关系。

为了避免死锁,我们只要破坏产⽣死锁的四个条件中的其中⼀个就可以了。

  • 如何避免死锁
  1. 破坏互斥条件 :这个条件我们没有办法破坏,因为我们⽤锁本来就是想让他们互斥的(临界资源需要互斥访问)。
  2. 破坏请求与保持条件 :⼀次性申请所有的资源。
  3. 破坏不剥夺条件 :占⽤部分资源的线程进⼀步申请其他资源时,如果申请不到,可以主动释放它占有的资源。
  4. 破坏循环等待条件 :靠按序申请资源来预防。按某⼀顺序申请资源,释放资源则反序释放。破坏循环等待条件。

Lock(锁)学习

synchronized与Lock的对比

线程协作

  • 生产者消费者模式

解决方式一:管程法:利用缓存区解决

  • 逻辑:生产者只负责生产;消费者只负责消费;缓存区:生产者生产产品,判断能否生产,如果满了就停止生产等待消费者消费,没满就继续生产,并通知消费者消费;消费者消费产品,判断能否进行消费,如果空了就无法消费等待生产者生产,如果可以消费,就消费,并通知生产者生产 通知唤醒:this.notiyall()

解决方式二:信号灯法:通过标志位解决

线程池

  • 使⽤线程池的好处:
    • 降低资源消耗。通过重复利⽤已创建的线程降低线程创建和销毁造成的消耗。
    • 提⾼响应速度。当任务到达时,任务可以不需要的等到线程创建就能⽴即执⾏。
    • 提⾼线程的可管理性。线程是稀缺资源,如果⽆限制的创建,不仅会消耗系统资源,还会降
    • 低系统的稳定性,使⽤线程池可以进⾏统⼀的分配,调优和监控。

回顾

posted @ 2021-06-24 22:19  BigMonster85  阅读(40)  评论(0)    收藏  举报