Java教程

Java基础 -- 多线程(二)

本文主要是介绍Java基础 -- 多线程(二),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Java基础 -- 多线程(二)

1. 线程同步

  • 什么是线程同步?

翻译:线程同步是针对于共享临界资源的两个或多个并发执行的线程。同步线程是为了避免临界资源使用过程中发生的冲突。否则,当并发运行的线程尝试在同一时间修改同一个变量会发生冲突。

  • 为什么引入线程同步?

  • 如何实现线程同步?

实现线程同步的核心思想就是:给被访问的资源上锁,某一时刻只能被一个线程操作

Java中实现线程同步共有三种方法,分别是:同步代码块,同步方法以及Lock锁

  • 同步代码块:

    • 格式:synchronized (同步监视器) {需要被同步的代码}

    • 具体含义:

      • synchronized:同步;作用:保证同一时刻,被修饰的代码块或者方法只会有一个线程执行,以达到保证并发安全的效果

      • 同步监视器:锁-->obj,Object obj = new Object() ;

      • 被同步的代码:操作共享数据(多个线程共同操作的变量)的代码

    • 优缺点:

  • 同步方法:

    • 格式:修饰符 synchronized 返回值类型 方法名(参数列表){方法体}

    • 要点:

  • Lock锁

    • 具体格式:实例化ReentrantLock对象; lock() ;需要同步的语句;unlock();

【注】线程同步方式使用顺序建议:Lock--> 同步代码块 -->同步方法块

  • synchronized详解

  • synchronized和Lock的异同

2. 线程通信

  • 什么是线程通信?

线程通信就是当多个线程共同操作共享的资源时,互相告知自己的状态以避免资源争夺。

  • 线程之间如何通信?

  • wait()/notify()/notifyAll()详解

3. 线程池

  • 池化技术思想

为了减少获取资源的消耗,提高对资源的利用率

-** 什么是线程池,为什么引入线程池?**

总结来说,频繁的创建销毁线程会造成资源的浪费,为了解决这个问题,引入线程池

  • 线程池的好处?

4. ThreadLocal

  • 为什么引入ThreadLocal?

一般来说,变量被所有线程共享,如果线程想拥有一个只属于自己的本地变量,就设置成ThreadLocal。用来避免线程竞争,也避免了线程安全问题

  • ThreadLocal是什么?

ThreadLocal:本地线程变量
ThreadLocal类形象的比喻成存放数据的盒子,盒子中可以存储每个线程的私有数据。

  • ThreadLocal怎么用?

    • 创建一个ThreadLocal对象
private ThreadLocal<Integer> localInt = new ThreadLocal<>();

  • setAndGet()设置获取变量值
public int setAndGet(){
    localInt.set(8);
    return localInt.get();
}

5. 死锁

  • 什么是死锁?

进程P1此时占有资源R1,P2占有资源R2。进程P1申请R2,申请到R2后释放资源R1;进程P2申请R1,申请到R1后释放占用的资源R1。
这种因进程之间相互竞争资源导致相互等待而无法推进的情况被成为死锁。

  • 产生死锁的四个必要条件?

    • 互斥条件

    • 请求和保持条件

    • 不剥夺条件

    • 循环等待条件

  • 如何处理死锁问题?

处理死锁主要从三个方面来探讨:预防,避免,检测与恢复

  • 预防死锁:破坏死锁发生的四个条件之一

    • 临界资源-->共享资源(破坏互斥条件)
    • 资源预先分配(破坏请求和保持)
    • 可剥夺(破坏不剥夺)
    • 资源有序分配策略(破坏循环等待)
  • 避免死锁:安全序列,银行家算法

  • 死锁检测与恢复

    • 检测:死锁检测算法
    • 恢复:剥夺资源;撤销进程·

6. 参考资料

https://blog.csdn.net/shengabc/article/details/47379541
https://juejin.cn/post/6959333602748268575
https://www.jianshu.com/p/210eab345423
https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html
https://www.zhihu.com/question/529948412
https://zhuanlan.zhihu.com/p/138689342

这篇关于Java基础 -- 多线程(二)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!