博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java多线程之锁
阅读量:4093 次
发布时间:2019-05-25

本文共 1526 字,大约阅读时间需要 5 分钟。

    • 锁的分类
      • 偏向锁
      • 轻量级锁
      • 死锁
        • 场景
          • 两个线程分别占有另一线程需要的资源,等待对方互相释放锁,或是某一线程释放是发生异常没释放掉,导致系统不可用的一个现象。
        • 分析
          • jps 查看java进程的pid
          • jstack pid dump哪个线程出现了问题
        • 避免死锁的方法
          • 避免一个线程同时获取多个锁
          • 避免一个线程在锁内同时占有多个资源,经理保证每个锁只使用一个资源
          • 尝试使用定时锁,如 lock.tryLock(timeOut)来替代使用内部锁
          • 对于数据库锁,加锁与解锁必须在同一个connection连接内,否则会出现解锁失败的情况
        • synchronized的使用与原理
          • 大致介绍一下它属于java并发编程中常见的一个锁,属于重量级锁。
          • 使用
            • 加在普通方法上 锁为当前的实例对象
            • 加在静态方法上,锁为当前类的class对象
            • 同步方法块上,锁时括号内配置的对象
          • 原理
            • 当一个线程试图操作同步代码块时,必须先获取锁,同时在退出或抛出异常时必须释放锁。从jvm层次来看,使用Monitor对象来控制同步方法,这里会出现moniterenter(开始)和monitorexit(结束)指令。线程执行到开始指令会尝试回去moniter所有权即获取对象的锁。
        • Lock
          • 手动加锁与释放
Lock lock = new ReentrantLock();//放在try外面lock.lock();try {    }finally {     }
  • 与synchronized不同
    • 尝试非阻塞性的获取
    • 超时获取
    • 被中断的获取
      • 常见方法
        • void lock()      void lockInterruptibly() 可中断      Condition newCondition();      boolean tryLock(); 尝试获取      boolean tryLock(long time, TimeUnit unit);     void unlock(); 释放锁
      • 自定义同步组件
        • 静态内部类Sync extends AbstractQueuedSynchronizer
        • implements Lock
        • lock –> sync.xxx()
        • 线程获取锁失败后会放入同步队列中等待
      • 分析同步器是如何完成线程同步的
        • 同步队列
          • 节点
          • 前驱 后置引用
          • FIFO
          • 设置首节点
          • 设置尾节点
          • 独占式同步状态获取与释放
          • 简单说,在获取同步状态时,同步器维护了一个队列,获取失败的线程会进入队列并在队列中自旋,移出队列或停止自旋的条件时前驱节点为头节点,且成功获取了同步状态,释放同步状态时需要调用方法释放状态,唤醒头节点的后置节点。
            • 共享式同步状态获取与释放
              • 在同一个时刻能有多个线程获取到同步状态
              • tryAquiredShared()
              • tryReleaseShared()
            • 独占式超时获取同步状态
              • 会有一个等待时间,在指定时间内没获取到会从等待的逻辑中返回
            • 自定义同步器
        • 重入锁
          • 支持一个线程对资源重复加锁
          • synchronized 支持隐式重入
          • 公平与否
            • 在绝对时间上,先对锁进行获取的请求一定先满足那么就是公平的 先到先得FIFO
          • 实现
            • 指的是任意线程在获取锁之后重新获取该锁而不会被阻塞
              • 线程再次获取锁
              • 锁的最终释放 计数器 ++ –
          • 公平锁保证了FIFO其代价是进行了大量的线程切换
          • 非公平锁虽然可能会造成线程饥饿但是极少切换线程
        • 读写锁
          • 在同一时刻允许多个线程读,但是写线程访问时其他线程均被阻塞
          • ReentrantReadWriteLock
          • 实例代码 通过读写锁保证了线程安全
          • public class Cache {     static Map

转载地址:http://qqiii.baihongyu.com/

你可能感兴趣的文章
B 站爆红的数学视频,竟是用这个 Python 开源项目做的!
查看>>
安利 10 个让你爽到爆的 IDEA 必备插件!
查看>>
自学编程的八大误区!克服它!
查看>>
GitHub 上的一个开源项目,可快速生成一款属于自己的手写字体!
查看>>
早知道这些免费 API,我就可以不用到处爬数据了!
查看>>
学习笔记4(内部类总结)
查看>>
使用类和对象
查看>>
学习笔记(引用,动态分配等等)
查看>>
迭代器使用
查看>>
HSV颜色特征
查看>>
java web技术
查看>>
matplotlib系列_2_修改坐标轴的刻度
查看>>
matplotlib系列_3_刻度中文及x,y轴的标签设置
查看>>
Python format 格式化函数
查看>>
SSH-->客户端登录出错
查看>>
(linux)BSP板级支持包开发理解
查看>>
matplotlib系列_4_其他设置
查看>>
undefined reference to `__atomic_load_8
查看>>
leetcode-1-两数之和
查看>>
Linux中的screen命令使用
查看>>