1、乐观锁:假定没有冲突,在更新数据时比较发现不一致时,则读取新值修改后重试更新。(自旋锁就是一种乐观锁)

2、悲观锁:假定会发生冲突,所有操作都加上锁,比如读数据操作。

3、自旋锁:循环使用cup时间,尝试cas操作直至成功返回true,不然一直循环。(比较内存值与线程旧值是否一致,一致则更新,不然则循环)

4、共享锁(多读):给资源加上读锁,其他线程也可以加读锁,可以同时读,不可以加写锁。
5、独享锁(单写):给资源加上写锁,可以修改资源,其他线程不能再加锁。

6、可重入锁、不可重入锁:线程获取到一把锁后,可以自由进入同一把锁所同步的其他代码。

// 可重入
public class ObjectSyncDemo2 {public synchronized void test1(Object arg) {System.out.println(Thread.currentThread() + " 我开始执行 " + arg);if (arg == null) {test1(new Object());}System.out.println(Thread.currentThread() + " 我执行结束" + arg);}public static void main(String[] args) throws InterruptedException {new ObjectSyncDemo2().test1(null);}
}
输出:
Thread[main,5,main] 我开始执行 null
Thread[main,5,main] 我开始执行 java.lang.Object@4554617c
Thread[main,5,main] 我执行结束java.lang.Object@4554617c
Thread[main,5,main] 我执行结束null

7、公平锁、非公平锁:获取锁时,按照线程先后顺序,则公平。

8、读写锁:

// 缓存示例
public class CacheDataDemo {// 创建一个map用于缓存private Map<String, Object> map = new HashMap<>();private static ReadWriteLock rwl = new ReentrantReadWriteLock();public static void main(String[] args) {// 1 读取缓存里面的数据// cache.query()// 2 如果换成没数据,则取数据库里面查询  database.query()// 3 查询完成之后,数据塞到塞到缓存里面 cache.put(data)}public Object get(String id) {Object value = null;// 首先开启读锁,从缓存中去取rwl.readLock().lock();try {if (map.get(id) == null) {// TODO database.query();  全部查询数据库 ,缓存雪崩// 必须释放读锁rwl.readLock().unlock();// 如果缓存中没有释放读锁,上写锁。如果不加锁,所有请求全部去查询数据库,就崩溃了rwl.writeLock().lock(); // 所有线程在此处等待  1000  1  999 (在同步代码里面再次检查是否缓存)try {// 双重检查,防止已经有线程改变了当前的值,从而出现重复处理的情况if (map.get(id) == null) {// TODO value = ...如果缓存没有,就去数据库里面读取}rwl.readLock().lock(); // 加读锁降级写锁,这样就不会有其他线程能够改这个值,保证了数据一致性} finally {rwl.writeLock().unlock(); // 释放写锁@}}} finally {rwl.readLock().unlock();}return value;}
}
// 将hashmap改造一个并发安全的
// 比hashTable的实现,效率高,读取的适合并不会同步执行
public class MapDemo {private final Map<String, Object> m = new HashMap<>();private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();private final Lock r = rwl.readLock();private final Lock w = rwl.writeLock();public Object get(String key) {r.lock(); // 可以同时多个线程获取这把锁try {return m.get(key);} finally {r.unlock();}}public Object[] allKeys() {r.lock();try {return m.keySet().toArray();} finally {r.unlock();}}public Object put(String key, Object value) {w.lock(); // 一个线程获取 这把锁try {return m.put(key, value);} finally {w.unlock();}}public void clear() {w.lock();try {m.clear();} finally {w.unlock();}}
}

自旋锁、乐观锁、悲观锁、重入锁、公平锁相关推荐

  1. 【并发编程】线程锁--Synchronized、ReentrantLock(可重入锁)

    在说锁之前,我们要明白为什么要加锁,不加锁会怎样? 在并发编程中,很容易出现线程安全问题,接下来我们看个很经典的例子--银行取钱,来看一下有关线程安全的问题. 取钱的流程可以分为一下几个步骤: 1.用 ...

  2. 线程同步锁 java_java多线程同步之重入锁,详细解析

    上次已经为大家介绍过java多线程同步,Volatile详解的主要内容了.今天再来为大家介绍一些相关的内容,也就是java多线程同步之重入锁,一起来了解一下吧. 使用重入锁实现线程同步 在JavaSE ...

  3. Java并发编程(1):可重入内置锁

    每个Java对象都可以用做一个实现同步的锁,这些锁被称为内置锁或监视器锁.线程在进入同步代码块之前会自动获取锁,并且在退出同步代码块时会自动释放锁.获得内置锁的唯一途径就是进入由这个锁保护的同步代码块 ...

  4. Java并发编程实战————可重入内置锁

    引言 在<Java Concurrency in Practice>的加锁机制一节中作者提到: Java提供一种内置的锁机制来支持原子性:同步代码块."重入"意味着获取 ...

  5. 可重入锁 不可重入锁_什么是可重入锁?

    可重入锁 不可重入锁 在Java 5.0中,增加了一个新功能以增强内部锁定功能,称为可重入锁定. 在此之前,"同步"和"易失性"是实现并发的手段. public ...

  6. 锁Lock,主要是重入锁和读写锁

    2019独角兽企业重金招聘Python工程师标准>>> 在java多线程中,我们可以使用synchronized关键字来实现线程之间的同步互斥工作.还有一个更优秀的机制去完成这个&q ...

  7. 可重入锁_什么是可重入锁?

    可重入锁 在Java 5.0中,增加了一个新功能以增强内部锁定功能,称为Reentrant Lock. 在此之前,"同步"和"易失"是实现并发的手段. publ ...

  8. mysql 锁机制及实现原理_MySQL-深入浅出锁分类及实现原理

    个人公众号『码农札记』,欢迎关注,查看更多精彩文章. 背景 数据库是一个多用户并发使用的共享资源.当多个并发读写数据时,在数据库中就会产生多个事务同时读写同一数据的情况. 若对并发操作不加控制就可能会 ...

  9. 公平锁非公平锁的实际使用_理解ReentrantLock的公平锁和非公平锁

    学习AQS的时候,了解到AQS依赖于内部的FIFO同步队列来完成同步状态的管理,当前线程获取同步状态失败时,同步器会将当前线程以及等待状态等信息构造成一个Node对象并将其加入到同步队列,同时会阻塞当 ...

  10. java公平锁和非公平锁_java并发编程学习之再谈公平锁和非公平锁

    在java并发编程学习之显示锁Lock里有提过公平锁和非公平锁,我们知道他的使用方式,以及非公平锁的性能较高,在AQS源码分析的基础上,我们看看NonfairSync和FairSync的区别在什么地方 ...

最新文章

  1. Mobileye 自动驾驶策略(一)
  2. apache ab压力测试工具-批量压测脚本
  3. jquery after append appendTo三个函数的区别
  4. 51CTO学院三周年-最受学员喜爱讲师评选大赛
  5. cadence 常见pcb电阻_经验分享|高频PCB设计中出现的干扰分析及对策
  6. 双盘转子动力学仿真c语言程序,递归牛顿欧拉(正)动力学仿真
  7. 从服务器恢复系统,服务器恢复系统
  8. 如何通过项目周报获取项目信息-周报模板
  9. 算法:线性时间选择(C/C++)
  10. 模拟电路——基本放大电路
  11. ftp服务器vsftpd配置文件,vsftpd配置文件详解及ftp服务器搭建
  12. 量子计算机基本信息单位,量子计算机.ppt
  13. Android 9 禁用按住电源键+音量加键进入工厂测试(recovery模式)功能
  14. 找出不大于n的最大质数
  15. 计算机不能上网查找原因的步骤,电脑能连接上wifi但不能上网的原因_电脑能连接上wifi但不能上网的解决方法...
  16. 抖音高贵气质的签名_抖音2100万赞!95后小伙“乡村维密秀”走红外媒:人生道阻且长,有梦想,谁都了不起...
  17. CTF show 萌新区解题报告 (一)
  18. 【区块链】Web3.0黑话合集:区块链/Token等专业术语
  19. Mac电脑什么截图软件最好用?Snipaste for Mac实用截图教程
  20. prompt综述论文阅读:Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in Natural La

热门文章

  1. 解决 uni-app 使用 Painter 生成商品海报真机模糊问题
  2. 误删的文件,回收站没有怎么恢复?
  3. 【微前端】什么是微前端
  4. 518抽奖软件——极简设计、极致体验
  5. takemehigher计算机乐谱,【图片】简谱【无饿不作吧】_百度贴吧
  6. oninput 、onpropertychange 、addEvent思考
  7. 一文看尽2019 MWC十大新机
  8. 企业如何构建数字化平台战略,加速规模化创新
  9. SpaceX十年磨一剑
  10. 基于虚拟仪器的电磁阀综合特性系统设计