翻译:线程同步是针对于共享临界资源的两个或多个并发执行的线程。同步线程是为了避免临界资源使用过程中发生的冲突。否则,当并发运行的线程尝试在同一时间修改同一个变量会发生冲突。
实现线程同步的核心思想就是:给被访问的资源上锁,某一时刻只能被一个线程操作
Java中实现线程同步共有三种方法,分别是:同步代码块,同步方法以及Lock锁
同步代码块:
格式:synchronized (同步监视器) {需要被同步的代码}
具体含义:
synchronized:同步;作用:保证同一时刻,被修饰的代码块或者方法只会有一个线程执行,以达到保证并发安全的效果
同步监视器:锁-->obj,Object obj = new Object() ;
被同步的代码:操作共享数据(多个线程共同操作的变量)的代码
优缺点:
同步方法:
格式:修饰符 synchronized 返回值类型 方法名(参数列表){方法体}
要点:
Lock锁
【注】线程同步方式使用顺序建议:Lock--> 同步代码块 -->同步方法块
synchronized详解
synchronized和Lock的异同
线程通信就是当多个线程共同操作共享的资源时,互相告知自己的状态以避免资源争夺。
为了减少获取资源的消耗,提高对资源的利用率
-** 什么是线程池,为什么引入线程池?**
总结来说,频繁的创建销毁线程会造成资源的浪费,为了解决这个问题,引入线程池
一般来说,变量被所有线程共享,如果线程想拥有一个只属于自己的本地变量,就设置成ThreadLocal。用来避免线程竞争,也避免了线程安全问题
ThreadLocal:本地线程变量
ThreadLocal类形象的比喻成存放数据的盒子,盒子中可以存储每个线程的私有数据。
ThreadLocal怎么用?
private ThreadLocal<Integer> localInt = new ThreadLocal<>();
public int setAndGet(){ localInt.set(8); return localInt.get(); }
进程P1此时占有资源R1,P2占有资源R2。进程P1申请R2,申请到R2后释放资源R1;进程P2申请R1,申请到R1后释放占用的资源R1。
这种因进程之间相互竞争资源导致相互等待而无法推进的情况被成为死锁。
产生死锁的四个必要条件?
互斥条件
请求和保持条件
不剥夺条件
循环等待条件
如何处理死锁问题?
处理死锁主要从三个方面来探讨:预防,避免,检测与恢复
预防死锁:破坏死锁发生的四个条件之一
避免死锁:安全序列,银行家算法
死锁检测与恢复
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