今天是九一八事变爆发 88 周年,国耻日。


每当我看到祖国的航空航天、互联网、5G 这些科技方面赶超美国的新闻时,我内心都异常激动,从 "东亚病夫" 到吾辈自强,靠得是无数中华儿女的实干。


铭记历史...





工作再忙,还是希望坚持把编程知识分享下去,继续 Java 并发编程。


在并发编程中,经常会遇到多个线程访问同一个共享变量,当同时对共享变量进行读写操作时,就会产生数据不一致的情况。


为了解决这个问题

  • JDK 1.5 之前,使用 synchronized 关键字,拿到 Java 对象的锁,保护锁定的代码块。JVM 保证同一时刻只有一个线程可以拿到这个 Java 对象的锁,执行对应的代码块。

  • JDK 1.5 开始,引入了并发工具包 java.util.concurrent.locks.Lock,让锁的功能更加丰富。

 

常见的锁

  • synchronized 关键字锁定代码库

  • 可重入锁 java.util.concurrent.lock.ReentrantLock

  • 可重复读写锁 java.util.concurrent.lock.ReentrantReadWriteLock

 

Java 中不同维度的锁分类

可重入锁

  • 指在同一个线程在外层方法获取锁的时候,进入内层方法会自动获取锁。JDK 中基本都是可重入锁,避免死锁的发生。上面提到的常见的锁都是可重入锁。

 

公平锁 / 非公平锁

  • 公平锁,指多个线程按照申请锁的顺序来获取锁。如 java.util.concurrent.lock.ReentrantLock.FairSync

  • 非公平锁,指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程先获得锁。如 synchronized、java.util.concurrent.lock.ReentrantLock.NonfairSync

        
独享锁 / 共享锁

  • 独享锁,指锁一次只能被一个线程所持有。synchronized、java.util.concurrent.locks.ReentrantLock 都是独享锁

  • 共享锁,指锁可被多个线程所持有。ReadWriteLock 返回的 ReadLock 就是共享锁

          
悲观锁 / 乐观锁

  • 悲观锁,一律会对代码块进行加锁,如 synchronized、java.util.concurrent.locks.ReentrantLock

  • 乐观锁,默认不会进行并发修改,通常采用 CAS 算法不断尝试更新

  • 悲观锁适合写操作较多的场景,乐观锁适合读操作较多的场景

        
粗粒度锁 / 细粒度锁

  • 粗粒度锁,就是把执行的代码块都锁定

  • 细粒度锁,就是锁住尽可能小的代码块,java.util.concurrent.ConcurrentHashMap 中的分段锁就是一种细粒度锁

  • 粗粒度锁和细粒度锁是相对的,没有什么标准

        
偏向锁 / 轻量级锁 / 重量级锁

  • JDK 1.5 之后新增锁的升级机制,提升性能。

  • 通过 synchronized 加锁后,一段同步代码一直被同一个线程所访问,那么该线程获取的就是偏向锁

  • 偏向锁被一个其他线程访问时,Java 对象的偏向锁就会升级为轻量级锁

  • 再有其他线程会以自旋的形式尝试获取锁,不会阻塞,自旋一定次数仍然未获取到锁,就会膨胀为重量级锁        

        
自旋锁

  • 自旋锁是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环占有、浪费 CPU 资源


更多相关文章

  1. 线程包括哪些状态?状态之间是如何转变的?
  2. 什么是守护线程?
  3. 如何优雅地停止一个线程?
  4. 如何合理的设计代码分层,论代码分层的设计之道
  5. java多线程(11)AtomicBoolean原子类分析
  6. Java基础系列:线程同步和线程池
  7. java多线程(6)sleep和wait的4大区别
  8. java多线程(5)多线程通信出现的假死现象分析
  9. java多线程(4)使用wait/notify机制进行单线程之间的通信

随机推荐

  1. android开发每日汇总【2011-10-31】
  2. Android菜单Menu的创建
  3. Android属性gravity与layout_gravity的区
  4. Android Fragment 实例
  5. Android 学习笔记--android基本注意点
  6. Eclipse Android 代码自动提示功能
  7. android Shape实现边框圆角
  8. Android中的界面组成
  9. Android与PC通过USB连接通信(一)
  10. TextView的drawable属性