来源:jianshu.com/p/e674ee68fd3f

1、为什么要用锁?

锁-是为了解决并发操作引起的脏读、数据不一致的问题。

2、锁实现的基本原理

2.1、volatile

Java编程语言允许线程访问共享变量, 为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁要更加方便。

volatile在多处理器开发中保证了共享变量的“ 可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。

结论:如果volatile变量修饰符使用恰当的话,它比synchronized的使用和执行成本更低,因为它不会引起线程上下文的切换和调度。

2.2、synchronized

synchronized通过锁机制实现同步。

先来看下利用synchronized实现同步的基础:Java中的每一个对象都可以作为锁。

具体表现为以下3种形式。

对于普通同步方法,锁是当前实例对象。

对于静态同步方法,锁是当前类的Class对象。

对于同步方法块,锁是Synchonized括号里配置的对象。

当一个线程试图访问同步代码块时,它首先必须得到锁,退出或抛出异常时必须释放锁。

2.2.1 synchronized实现原理

synchronized是基于Monitor来实现同步的。

Monitor从两个方面来支持线程之间的同步:

互斥执行

协作

1、Java 使用对象锁 ( 使用 synchronized 获得对象锁 ) 保证工作在共享的数据集上的线程互斥执行。

2、使用 notify/notifyAll/wait 方法来协同不同线程之间的工作。

3、Class和Object都关联了一个Monitor。

Monitor 的工作机理

线程进入同步方法中。

为了继续执行临界区代码,线程必须获取 Monitor 锁。如果获取锁成功,将成为该监视者对象的拥有者。任一时刻内,监视者对象只属于一个活动线程(The Owner)

拥有监视者对象的线程可以调用 wait() 进入等待集合(Wait Set),同时释放监视锁,进入等待状态。

其他线程调用 notify() / notifyAll() 接口唤醒等待集合中的线程,这些等待的线程需要重新获取监视锁后才能执行 wait() 之后的代码。

同步方法执行完毕了,线程退出临界区,并释放监视锁。

参考文档:、锁的使用用例

4.1、ConcurrentHashMap的实现原理及使用



ConcurrentHashMap类图



ConcurrentHashMap数据结构

结论:ConcurrentHashMap使用的锁分段技术。首先将数据分成一段一段地存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。

原文地址:https://mp.weixin.qq.com/s/3BITJAlZUa2AoVFtcV7xsA

最新文章

  1. 将十进制数转为一个n位数的密码(每位都是个m进制数)
  2. 我们为什么要配置CATALINA_HOME环境变量
  3. 使用PowerQuery操作OData数据
  4. (WF)
  5. IOS ITunesConnect 修改开发商名称
  6. 操作系统之进程篇(4)--经典进程间通信(IPC)问题
  7. SQL Server DML(SELECT)常见用法(二)
  8. Shiro学习笔记(5)——web集成
  9. Windows 小端存储
  10. Springboot 框架实现rest接口风格
  11. java第九次学习总结
  12. vue项目中引入mint-ui的方式(全部引入与按需引入)
  13. logstash关于date时间处理的几种方式总结
  14. python中random模块
  15. Python全栈之路----函数----局部变量
  16. 2018.4.27 python使用过的第三方库
  17. 对dump的文件进行状态统计
  18. Windows ->> Windows下安装MSI程序遇到2503和2502错误
  19. WPF使用Expression Design设计图形
  20. Android NDK 安装与配置

热门文章

  1. GO -- 遍历删除 数组 slice
  2. SQL-W3School-函数:SQL GROUP BY 语句
  3. 建立django项目的完整流程
  4. Spring Cloud(7.3):配置Consumer Server
  5. 【Leetcode_easy】693. Binary Number with Alternating Bits
  6. 第十九章 动态URL权限控制——《跟我学Shiro》
  7. Docker - 在CentOS7中安装Docker
  8. Informix网页数据维护客户端工具
  9. Linux 教程学习笔记
  10. 最新 花椒直播java校招面经 (含整理过的面试题大全)