I、java中的锁

1.1 什么是锁

​ 在计算机科学中,锁(lock)与互斥(mutex)是一种同步机制,用于在许多线程执行时对资源的限制。

​ 锁通常需要硬件支持才可以有效实施。这种支持通常采用一个或多个原子指令,测试单个线程是否空闲。

1.2 锁的三个概念

1. 锁开销:就是完成一个锁可能额外耗费的资源,比如一个周期所需要的时间,内存空间。
2. 锁竞争:一个线程或进程,要获取另一个线程或进程所持有的锁,边会发生锁竞争。锁粒度越小,竞争的可能约小。
3. 死锁:互相锁住了

2 锁的分类

2.1 独享锁/共享锁

​ 我私底下更想将其称作为,开源锁和闭源锁。好了我觉得说到这里可以了。

2.2 互斥所/读写锁

​ 互斥所与读写锁是狭义的说法。ReentrantLock就是互斥锁也是独享锁,ReadWriteLock就是读写锁也是共享锁。

独享与共享是被AQS(AbstractQueuedSynchronizer)定义的,

2.3 锁升级/所降级

低于16位属于写锁,高于16位属于读锁

2.4 公平锁/非公平锁

公平锁是按照线程的申请顺序来进行的

非公平锁是按照优先级进行,所以可能会差生饥饿现象

  1. RenntranLock 而言,默认是非公平,但也可以是公平锁。通过构造函数指定。非公平锁的吞吐量就是比公平锁大。
  2. Synchronized也是一种非公平锁。由于没有AQS,所以 没可能是公平锁。

2.5 可重入锁

也称递归锁,再同一线程的外层方法获取锁的时候,在进入内层方法自动获取锁。

ReentrantLock 和 Synchronized都是可重入锁。可重入锁一个好处是在一定程度上避免死锁。

2.6 乐观锁/悲观锁

这两个并没有特定的类型,而是在看待并发之角度

悲观锁认为存在很多并发操作,采取加锁措施,不加锁一定会有问题。

乐观锁认为不存在很多并发操作就没必要加锁

2.7 分段锁

分段锁也是一种锁设计,而不是特定的锁。比如ConcuttenHashMap通过分段锁来实现高并发

2.8 自旋锁

自旋锁是指试探资源的线程并不阻塞线程,而是采取循环的方式尝试获取线程,好处是减少上下文的切换,缺点是一直占用CPU

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

优点 缺点 适用场景
偏向锁 加锁解锁无需额外的消耗 如果存在锁竞争,则存在锁撤销的消耗 只有一个线程访问同步方法快的场景
轻量级锁 竞争的线程不会存在阻塞,提高了程序的响应速度。 若始终得不到锁竞争的线程使用自旋会消耗CPU 同步块执行的速度非常的快
重量级锁 线程使用者不会自旋,不会消耗CPU 线程阻塞,响应时间慢 吞吐量大

听说你知道什么是锁 --JAVA的更多相关文章

  1. 可重入锁 & 自旋锁 & Java里的AtomicReference和CAS操作 & Linux mutex不可重入

    之前还是写过蛮多的关于锁的文章的: http://www.cnblogs.com/charlesblc/p/5994162.html <[转载]Java中的锁机制 synchronized &a ...

  2. 对象级别锁 vs 类级别锁 – Java

    同步针对的是多线程.同步的方法或代码块同时只能由一个线程执行. Java支持多线程来执行.这可能会导致两个或多个线程访问同一个字段或对象.同步是一个使所有并发执行的线程同步的过程.同步避免了由于共享内 ...

  3. 监视锁——Java同步的基本思想

    翻译人员: 铁锚翻译时间: 2013年11月13日原文链接: Monitors – The Basic Idea of Java synchronization如果你上过操作系统课程,你就知道监视锁( ...

  4. 基于redis的 分布式锁 Java实现

    package com.hs.services.lock; import java.util.concurrent.TimeUnit; import javax.annotation.Resource ...

  5. 行级锁 java||数据库

    http://www.cnblogs.com/xiyubaby/p/4623516.html select * from t for update 会等待行锁释放之后,返回查询结果. select * ...

  6. 锁——Java同步的基本思想

    翻译人员: 铁锚 翻译时间: 2013年11月13日 原文链接:  Monitors – The Basic Idea of Java synchronization 如果你上过操作系统课程,你就知道 ...

  7. 12、java5锁java.util.concurrent.locks.Lock之ReentrantLock

    JDK文档描述: public interface LockLock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作.此实现允许更灵活的结构,可以具有差别很大的属性,可 ...

  8. 多线程 共享资源 同步锁 java

    Java多线程编程:Lock   synchronized是java中的一个关键字,也就是说是Java语言内置的特性.那么为什么会出现Lock呢? 如果一个代码块被synchronized修饰了,当一 ...

  9. 五分钟学会悲观乐观锁-java vs mysql vs redis三种实现

    1 悲观锁乐观锁简介 乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果 ...

随机推荐

  1. linux进程守护脚本

    为了防止进程异常挂掉,为了避免影响业务,编写一个守护进程,定时检查某个进程是否存在,如果不存在则自动启动该进程.编写脚本文件daemon.sh文件 while true; do server=`ps ...

  2. win 10 关闭或打开 测试模式

    一.关闭测试模式 方法: 以管理员身份运行 cmd 运行:bcdedit /set testsigning off 重启电脑 二.开启测试模式 以管理员身份运行 cmd 运行:bcdedit /set ...

  3. 【环境搭建与软件安装】windows系统基于Anaconda安装tensorflow-gpu

    https://github.com/tensorflow/tensorflow/issues/21832 原来是tensorflow-gpu-1.10.0,准备改为1.9.0试试,同样的问题: 应该 ...

  4. [LeetCode] 313. Super Ugly Number 超级丑陋数

    Write a program to find the nth super ugly number. Super ugly numbers are positive numbers whose all ...

  5. SVN 本地文件锁/服务端文件锁清除步骤

    1.本地文件锁,直接cleanup,cleanup界面选择break locks即可 2.服务端文件锁,本地文件右击没有release lock或者break lock的选项时 方法1:右键,svn选 ...

  6. linux服务器通过X11实现图形化界面显示

    1 背景描述 有些LINUX服务器出于性能和效率的考虑,通常都是没有安装图形化界面的,那么图形化程序在服务器上压根儿就跑不起来,或者无法直接显示出来,这就很尴尬了!那么如何解决这个问题呢?可以基于X1 ...

  7. Java 8 集合之流式(Streams)操作, Streams API 详解

    因为当时公司的业务需要对集合进行各种各样的业务逻辑操作,为了提高性能,就用到了这个东西,因为以往我们以前用集合都是需要去遍历(串行),所以效率和性能都不是特别的好,而Streams就可以使用并行的方式 ...

  8. 微信小程序访问豆瓣电影api400错误解决方法

    最近在跟着demo学习微信小程序,却卡在了第一步请求豆瓣电影api上,折腾了很久,代码如下: wx.request({ url : "https://api.douban.com/v2/mo ...

  9. linux命令kill和kill -9的区别

    linux命令kill和kill -9的区别 2018年04月13日 16:53:07 坠入苦海销尘垢 阅读数 2854   转载自https://www.cnblogs.com/liuhouhou/ ...

  10. Python各个岗位的开发流程

     根据张大美女提供资料微修改,在这谢谢张大美女! 1.python软件开发工程师 1.1 项目启动会 说明项目目标.阶段划分.组织结构.管理流程等关键事项. 1.2 需求调研 由用户提出,描述产品的功 ...