Java并发编程

多线程编程的特点

  • 同一份代码,可以有多个线程执行
    ——即可以在一个CPU核上面并发执行
    ——也可以在多个CPU核上并行执行
  • 线程的执行默认是乱序的
    ——程序员不能假定执行次序
  • 线程会共享数据(对象的变量)
    ——需要互斥
  • 线程之间也需要合作(同步
如何实现互斥?
  • 只有获得了锁的线程,才能对共享资源做操作,换句话说:进入临界区
  • 对共享资源做完操作(即使发生异常),一定要释放锁!

    这里写图片描述

锁是什么东西?
  • “锁”本身如果是软件,也没法保证原子性!
    ——多个CPU对“锁”操作的时候也会出错
  • 最底层需要硬件指令的支持
    ——TestAndSet
    ——Swap

这里写图片描述

这里写图片描述

设计“锁”需要考虑的问题
  • 线程申请锁的时候,发现已经被别的线程持有,线程该怎么办?
  • 1、继续尝试,无线循环
    ——时间片用完了,变成就绪状态,等待下次调度
    ——自旋锁
  • 2、把线程放到阻塞队列中
可重入性
  • 自旋锁无法重入
    这里写图片描述
  • 解决办法
    ——记录这个锁被谁持有
    ——记录重入的次数
线程之间的通信:wait/notify

这里写图片描述

线程之间的通信:join

这里写图片描述

JDK中常用的锁:可重入互斥锁
Lock lock = new ReentrantLock();
//获取锁
lock.lock();
try{

}finally{
    //释放锁
    lock.unlock();
}
JDK中常用的锁:信号量

这里写图片描述

在同一时刻,只能有三个线程获得锁(不是互斥的)

JDK常用的锁:Reader Writer

这里写图片描述

JDK常用的锁:CountDownLatch

这里写图片描述

JDK常用多的锁:CyclicBarrier

这里写图片描述

死锁

这里写图片描述

死锁的预防
  • 每个线程申请锁的时候都按特定的次序
    这里写图片描述
  • 申请锁的时候加上timeout
    -这里写图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值