1.公平锁、非公平锁


2.可重入锁(递归锁)

3.自旋锁

AtomicReference atomicReference = new AtomicReference();//原子引用线程
下面代码5秒钟自旋了10万次,还是很消耗CPU的

package HighConcurrency;import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;public class SpinLockDemo {//原子引用线程AtomicReference<Thread> atomicReference = new AtomicReference<>();public void myLock(){Thread thread = Thread.currentThread();System.out.println(Thread.currentThread().getName()+"\t come in");while(!atomicReference.compareAndSet(null,thread)){System.out.println(Thread.currentThread().getName()+"线程自旋。。。");}}public void myunLock(){Thread thread = Thread.currentThread();atomicReference.compareAndSet(thread,null);System.out.println(Thread.currentThread().getName()+"\t invoked myUnLock");}public static void main(String []args){SpinLockDemo spinLockDemo = new SpinLockDemo();new Thread(()->{spinLockDemo.myLock();//暂停线程一会try {TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); }spinLockDemo.myunLock();},"AA").start();try {TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }new Thread(()->{spinLockDemo.myLock();spinLockDemo.myunLock();},"BB").start();}
}

4.独占锁(写锁)|共享锁(读锁)

独占锁:指该锁一次只能被一个线程持有,ReentrantLock和synchronized都是独占锁
共享锁:可被多个线程所持有。对ReentrantReadWriteLock其读锁是共享锁,其写锁是独占锁。
读锁的共享锁可保证高并发读是非常都效的

class MyCache{ //资源类private volatile Map<String,Object> map = new HashMap<>();private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();//写缓存框架,读、写、清空public void get(String key,Object value){ //读rwLock.readLock().lock();try {System.out.println(Thread.currentThread().getName() + "\t 正在读取:");try { TimeUnit.MILLISECONDS.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); }Object object = map.get(key);System.out.println(Thread.currentThread().getName() + "\t 读取完成" + object);}catch (Exception e){e.printStackTrace();}finally {rwLock.readLock().unlock();}}public void put(String key,Object value){ //写rwLock.writeLock().lock();try {System.out.println(Thread.currentThread().getName()+"\t 正在写入" + key);try { TimeUnit.MILLISECONDS.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); }System.out.println(Thread.currentThread().getName()+"\t 写入完成");}catch (Exception e){e.printStackTrace();}finally {rwLock.writeLock().unlock();}}}
public class ReadWriteLockDemo {public static void main(String[] args) {MyCache myCache = new MyCache();//线程操作资源类for (int i = 0; i < 5; i++) {final int tempInt = i;new Thread(() -> {myCache.put(tempInt+"",tempInt+"");},"线程"+String.valueOf(i)).start();}for (int i = 0; i < 5; i++) {final int tempInt = i;new Thread(() -> {myCache.get(tempInt+"",tempInt+"");},"线程"+String.valueOf(i)).start();}}
}

java -锁(公平、非公平锁、可重入锁【递归锁】、自旋锁)相关推荐

  1. java中ReentrantLock实现,公平锁和非公平锁,AQS并发队列,

    一般在java中,遇到并发的时候,我们很多时候可能会使用synchronized关键字来实现锁,但是synchronized关键字有一定的缺陷(比如无法实现类似读锁.非公平),而Lock可以实现.在j ...

  2. java锁(公平锁和非公平锁、可重入锁(又名递归锁)、自旋锁、独占锁(写)/共享锁(读)/互斥锁、读写锁)

    前言 本文对Java的一些锁的概念和实现做个整理,涉及:公平锁和非公平锁.可重入锁(又名递归锁).自旋锁.独占锁(写)/共享锁(读)/互斥锁.读写锁 公平锁和非公平锁 概念 公平锁是指多个线程按照申请 ...

  3. java 共享锁 独占锁_java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁...

    一.公平锁与非公平锁 1.1 概述 公平锁:是指多个线程按照申请锁的顺序来获取锁. 非公平锁:是指在多线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取到锁,在高并发的情 ...

  4. Java成神之路——重入锁、公平非公平锁、自旋锁、读写锁

    你知道的Java锁有哪些? synchronized?Lock?它们又有什么区别?锁可分为哪些种类?锁是如何实现的? 公平与非公平锁 公平锁与非公平锁的区别体现在锁造成阻塞时的排队机制,公平锁按申请锁 ...

  5. java中的锁(悲观锁、乐观锁、可重入锁、不可重入锁、公平锁、非公平锁、自旋锁、阻塞锁...)

    Lock接口 1.简介.地位.作用 ① 锁是一种工具,用于控制对共享资源的访问 ② Lock和synchronized,这两个是最常见的锁,它们都可以达到线程安全的目的,但是在使用和功能上又有较大的不 ...

  6. Java 独占锁与共享锁、公平锁与非公平锁、可重入锁

    目录 背景 独占锁与共享锁 独占锁 共享锁 公平锁与非公平锁 公平锁 非公平锁 可重入锁 总结 背景 最近有一些小伙伴会问我一些关于并发相关的问题,在与他们的沟通中,我发现他们对锁的概念很模糊.这部分 ...

  7. Java中的锁机制 -- 乐观锁、悲观锁、自旋锁、可重入锁、读写锁、公平锁、非公平锁、共享锁、独占锁、重量级锁、轻量级锁、偏向锁、分段锁、互斥锁、同步锁、死锁、锁粗化、锁消除

    文章目录 1. Java中的锁机制 1.1 乐观锁 1.2 悲观锁 1.3 自旋锁 1.4 可重入锁(递归锁) 1.5 读写锁 1.6 公平锁 1.7 非公平锁 1.8 共享锁 1.9 独占锁 1.1 ...

  8. Java进阶:ReentrantLock实现原理解析(公平锁、非公平锁、可重入锁、自旋锁)

    概述 本篇将介绍公平锁.非公平锁.可重入锁.自旋锁相关理论知识,同时结合相关源码和Demo进行解析,主要是以ReentrantLock作为例子. 公平锁 公平锁定义 公平锁是指线程按照申请所的顺序来获 ...

  9. 重入锁、死锁、活锁、公平非公平锁……一下子都给你屡清楚了

    目录 写在前面 重入锁 线程饥饿死锁 死锁 活锁(Livelock) 公平锁非公平锁 互斥锁 读-写锁 写在前面 每当听公司大佬提起来,死锁.活锁.公平锁.非公平锁--自己也是知其然而不知其所以然. ...

  10. 线程调度、公平锁和非公平锁、乐观锁和悲观锁、锁优化、重入锁

    1. 线程调度 线程调度指的就是给线程分配使用处理器的过程.主要的调度方式有两种:协同式调度和抢占式调度. 1.1 协同式调度 线程完成自己的任务之后主动通知系统切换到另一个线程上. 优点: 实现简单 ...

最新文章

  1. P3321 [SDOI2015]序列统计(未解决)
  2. 完全没法比!华为P40 Pro和iPhone 9宣传视频同曝光
  3. [Flink] Flink运行报错The number of requested virtual cores for application master
  4. 按计划员自动带出对应任务类型
  5. new 动态分配数组空间 .xml
  6. 路由器防御Dos***方法
  7. “会用LabVIEW,但是却没有听说TestStand,好像有点说不过去吧!”(下)
  8. 深入浅出Python闭包
  9. c语言中头文件iostream,程序中为什么要包含头文件iostream.h?
  10. Oracle Coherence中文教程四:构建一个Coherence 应用
  11. 抓包发现tcp会话中老是出现重复的ack和大量的tcp重传——SACK(Selective Acknowledgment, 选择性确认)技术
  12. java游戏英雄时代攻略_军团战棋英雄时代战役攻略 战役全关卡通关攻略
  13. PDF如何在线翻译?PDF在线翻译的方法
  14. win+D无法回到桌面
  15. aix java解压,AIX 7.1 jar unzip解压报错问题解决
  16. mysql 全局不重复_如何批量生成MySQL不重复手机号大表实例代码
  17. 在Tomcat下部署Jenkins
  18. mongoDb中_id和ObjectId详细说明
  19. 【英语六级】【仔细阅读】(3)
  20. WeLink协作文档,职场的贴心助手

热门文章

  1. java+eclipse+selenium环境搭建
  2. cJONS序列化工具解读二(数据解析)
  3. JavaScript 判断浏览器类型
  4. nlp中的经典深度学习模型(二)
  5. 【数据结构与算法】【算法思想】【算法应用】【排序查找搜索】并行
  6. f2 柱状图滚动 钉钉小程序_详解钉钉小程序组件之自定义模态框(弹窗封装实现)...
  7. 排序算法入门之简单选择排序
  8. openwrt 格式化_OPENWRT扩展系统到U盘
  9. mysql编程_PHP数据库编程之一MySQL优化策略概述
  10. mysql数据库代码_【代码总结】MYSQL数据库的常见操作