听说你知道什么是锁 --JAVA
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 公平锁/非公平锁
公平锁是按照线程的申请顺序来进行的
非公平锁是按照优先级进行,所以可能会差生饥饿现象
- RenntranLock 而言,默认是非公平,但也可以是公平锁。通过构造函数指定。非公平锁的吞吐量就是比公平锁大。
- Synchronized也是一种非公平锁。由于没有AQS,所以 没可能是公平锁。
2.5 可重入锁
也称递归锁,再同一线程的外层方法获取锁的时候,在进入内层方法自动获取锁。
ReentrantLock 和 Synchronized都是可重入锁。可重入锁一个好处是在一定程度上避免死锁。
2.6 乐观锁/悲观锁
这两个并没有特定的类型,而是在看待并发之角度
悲观锁认为存在很多并发操作,采取加锁措施,不加锁一定会有问题。
乐观锁认为不存在很多并发操作就没必要加锁
2.7 分段锁
分段锁也是一种锁设计,而不是特定的锁。比如ConcuttenHashMap通过分段锁来实现高并发
2.8 自旋锁
自旋锁是指试探资源的线程并不阻塞线程,而是采取循环的方式尝试获取线程,好处是减少上下文的切换,缺点是一直占用CPU
2.9 偏向锁/轻量级锁/重量级锁
| 锁 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 偏向锁 | 加锁解锁无需额外的消耗 | 如果存在锁竞争,则存在锁撤销的消耗 | 只有一个线程访问同步方法快的场景 |
| 轻量级锁 | 竞争的线程不会存在阻塞,提高了程序的响应速度。 | 若始终得不到锁竞争的线程使用自旋会消耗CPU | 同步块执行的速度非常的快 |
| 重量级锁 | 线程使用者不会自旋,不会消耗CPU | 线程阻塞,响应时间慢 | 吞吐量大 |
听说你知道什么是锁 --JAVA的更多相关文章
- 可重入锁 & 自旋锁 & Java里的AtomicReference和CAS操作 & Linux mutex不可重入
之前还是写过蛮多的关于锁的文章的: http://www.cnblogs.com/charlesblc/p/5994162.html <[转载]Java中的锁机制 synchronized &a ...
- 对象级别锁 vs 类级别锁 – Java
同步针对的是多线程.同步的方法或代码块同时只能由一个线程执行. Java支持多线程来执行.这可能会导致两个或多个线程访问同一个字段或对象.同步是一个使所有并发执行的线程同步的过程.同步避免了由于共享内 ...
- 监视锁——Java同步的基本思想
翻译人员: 铁锚翻译时间: 2013年11月13日原文链接: Monitors – The Basic Idea of Java synchronization如果你上过操作系统课程,你就知道监视锁( ...
- 基于redis的 分布式锁 Java实现
package com.hs.services.lock; import java.util.concurrent.TimeUnit; import javax.annotation.Resource ...
- 行级锁 java||数据库
http://www.cnblogs.com/xiyubaby/p/4623516.html select * from t for update 会等待行锁释放之后,返回查询结果. select * ...
- 锁——Java同步的基本思想
翻译人员: 铁锚 翻译时间: 2013年11月13日 原文链接: Monitors – The Basic Idea of Java synchronization 如果你上过操作系统课程,你就知道 ...
- 12、java5锁java.util.concurrent.locks.Lock之ReentrantLock
JDK文档描述: public interface LockLock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作.此实现允许更灵活的结构,可以具有差别很大的属性,可 ...
- 多线程 共享资源 同步锁 java
Java多线程编程:Lock synchronized是java中的一个关键字,也就是说是Java语言内置的特性.那么为什么会出现Lock呢? 如果一个代码块被synchronized修饰了,当一 ...
- 五分钟学会悲观乐观锁-java vs mysql vs redis三种实现
1 悲观锁乐观锁简介 乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果 ...
随机推荐
- PHP 相关性系数计算
相关系数公式 参考:https://baike.baidu.com/item/相关系数 PHP 实现代码 public static function calc($list) { $cv = []; ...
- centos7下python2环境安装pip2、kazoo、bottle、beaker
摘自:https://mp.weixin.qq.com/s?src=11×tamp=1576355125&ver=2034&signature=mNp2na6VjFz ...
- [LeetCode] 666. Path Sum IV 二叉树的路径和 IV
If the depth of a tree is smaller than 5, then this tree can be represented by a list of three-digit ...
- (二)主板BIOS设置与硬盘分区、调整
1.主板BIOS设置 前提,你得有一台电脑,台式机或笔记本电脑都行. BIOS负责开机时对系统中各个硬件进行初始化设置和测试,以确保系统能正常工作,是电脑硬件与软件程序之间的一座桥梁. 电脑在开机启动 ...
- Android属性动画-简单实例
1.ValueAnimator //在2000毫秒内,将值从0过渡到1的动画 ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f); anim.setD ...
- python 数据库导入excel
import MySQLdb import xlwt def outMySQL(file_name): wb = xlwt.Workbook() sh = wb.add_sheet('sheet 1' ...
- TCP协议的11种状态及其变化过程?传输的内容又是什么?
在TCP的11种状态变迁中,我们需要用到TCP头部的三个标志位: 1.SYN,SYN=1表示这是一个连接请求报文或者连接接受报文 2.ACK,ACK=1,表示确认号生效 3.FIN,FIN=1表示发送 ...
- ERP通过JAVA流的形式将数据传到外围系统
1.ERP封装数据成XML写入数据库服务器指定文件 --指定相关文件信息 v_file_path := '/u01/test/app/fs1/EBSapps/appl/cux/12.0.0/forms ...
- matlab 2017b 支持的C编译器
在电力电子开发领域,matlab是非常重要的工具,随着系统仿真和编程开发的不断融合,在matlab中使用混合编程并进行仿真验证,甚至是软件工程里面,源文件的自生成.编译以及一键程序下载等功能,都是越来 ...
- 解决pyspider框架web预览框过小问题
解决pyspider框架web预览框过小问题 Chrome 使用pyspider框架时,web预览框只有一小条: 解决办法: 找到debug.min.css文件,替换为如下内容: body{margi ...