锁分析
Lock
NonReentrantLock
ReadLock 共享锁
ReentrantLock 重入锁 排他锁
sync.lock 返回值为void,表示如无异常发生都认为锁获取成功
FairSync.lock 公平锁
FairSync.tryAcquire
获取线程
获取线程重入次数
重入次数为0
是 也就是第一次获取锁
在队列头部(队列为空或者当前线程在队列头部)
获取锁 设置锁状态 重入次数
设置锁的独占线程
获取锁成功

当前线程是否是锁的独占线程

重入次数+1 成功获取锁

获取锁失败
NonfairSync.lock 非公平锁
NonfairSync.lock
按照假设当前线程是第一次获取锁来申请锁
成功
设置当前线程为锁的独占线程
失败
按照重入的方式获取锁
WriteLock 排他锁 CAS 存在ABA的问题
ReentrantLock 重入锁默认构造是非公平锁实现,当申请锁的线程刚好碰到正在执行的线程释放了锁,那么他就有机会直接获取到锁,而不用排队。 重入锁的公平锁实现原理:
如果当前线程第一次获取锁,如果当前线程在抽象队列同步执行器的队首位置,利用CAS原理修改线程重入次数为1,成功则修改锁的独占线程为当前线程。
如果当前线程不是第一次获取锁,那么判断当前锁的独占线程与当前获取锁的线程是否一致,如果一致那么获取锁成功。 重入锁的非公平锁实现原理:
尝试按照第一次获取锁的方式直接获取锁,成功则获取锁成功
失败则重入的方式获取锁(判断当前线程与锁的独占锁是否一致)

 
Lock本地锁应用场景 
根据锁创建的位置可以分为,对象锁,全局锁
1、对象锁,对象持有锁,在并发访问对象资源时可以用该锁控制。
public class ObjectLock {

    private Lock objectLock = new ReentrantLock();

    void objectLock(Ticket ticket) {
objectLock.lock();
try {
System.out.println(Thread.currentThread().getName()+":"+ticket.getNum());
ticket.setNum(ticket.getNum()+1);
Thread.sleep(1000);
} catch (Exception e) {
Console.error(e);
} finally {
objectLock.unlock();
}
} }
2、全局锁,创建一个静态常量的锁,在系统全局都可以使用该锁。
public interface LockConstant {

    Lock lock = new ReentrantLock();

}
void lockConstant(Ticket ticket) {
Lock lock = LockConstant.lock;
lock.lock();
try {
System.out.println(Thread.currentThread().getName()+":"+ticket.getNum());
ticket.setNum(ticket.getNum()+1);
Thread.sleep(100);
} catch (Exception e) {
Console.error(e);
} finally {
lock.unlock();
}
}


锁分析 Lock的更多相关文章

  1. Redisson分布式锁学习总结:可重入锁 RedissonLock#lock 获取锁源码分析

    原文:Redisson分布式锁学习总结:可重入锁 RedissonLock#lock 获取锁源码分析 一.RedissonLock#lock 源码分析 1.根据锁key计算出 slot,一个slot对 ...

  2. 【转】锁(lock)知识及锁应用

    sql server锁(lock)知识及锁应用转自:http://blog.csdn.net/huwei2003/article/details/4047191 关键词:锁提示,锁应用 提示:这里所摘 ...

  3. java里的锁总结(synchronized隐式锁、Lock显式锁、volatile、CAS)

    一.介绍 首先, java 的锁分为两类: 第一类是 synchronized 同步关键字,这个关键字属于隐式的锁,是 jvm 层面实现,使用的时候看不见: 第二类是在 jdk5 后增加的 Lock ...

  4. 【python】多进程锁multiprocess.Lock

    [python]多进程锁multiprocess.Lock 2013-09-13 13:48 11613人阅读 评论(2) 收藏 举报  分类: Python(38)  同步的方法基本与多线程相同. ...

  5. 锁机制(Lock) 信号量机制(Semaphore) 事件机制(Event)

    IPC  进程间通信(inter-Process Communicate) 锁机制(Lock) l = Lock() 开启一个锁机制(实例化)   一把锁配一个钥匙 l.acquire()  获得钥匙 ...

  6. Synchronized和Lock, 以及自旋锁 Spin Lock, Ticket Spin Lock, MCS Spin Lock, CLH Spin Lock

    Synchronized和Lock synchronized是一个关键字, Lock是一个接口, 对应有多种实现. 使用synchronized进行同步和使用Lock进行同步的区别 使用synchro ...

  7. 自旋锁Spin lock与互斥锁Mutex的区别

    POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套常用的API.线程同步(Thread Synchronization)是并行编程中非常重要的通讯手段,其中最典型的应用 ...

  8. 同步锁之lock

    一. synchronized的缺陷 当一个代码块被synchronized修饰时,同时该代码块被一个线程执行,其他线程便只能一直等待,等待获取锁的线程释放锁,而这里获取锁的线程释放锁只会有两种情况: ...

  9. Java基础学习笔记: 多线程,线程池,同步锁(Lock,synchronized )(Thread类,ExecutorService ,Future类)(卖火车票案例)

    多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念.进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线 ...

随机推荐

  1. 电路调试检测维修总结积累 20181015 板子:3060-A

    今天在检修一块3060-A电路板时 发现   3.3V烫 但是3.3V路上的电容并没有短路 于是拆单片机   拆RS232EN  拆  FM24V 最后发现  原来是  1117-3.3  处的33U ...

  2. flink Checkpoint优化

    一.设置最小时间间隔 当flink应用开启Checkpoint功能,并配置Checkpoint时间间隔,应用中就会根据指定的时间间隔周期性地对应用进行Checkpoint操作.默认情况下Checkpo ...

  3. 3D网页小实验-基于Babylon.js与recast.js实现RTS式单位控制

    一.运行效果 1.建立一幅具有地形起伏和不同地貌纹理的地图: 地图中间为凹陷的河道,两角为突出的高地,高地和低地之间以斜坡通道相连. 水下为沙土材质,沙土材质网格贴合地形,河流材质网格则保持水平. 2 ...

  4. Java并发之AQS原理剖析

    概述: AbstractQueuedSynchronizer,可以称为抽象队列同步器. AQS有独占模式和共享模式两种: 独占模式: 公平锁: 非公平锁: 共享模式: 数据结构: 基本属性: /** ...

  5. F5 api接口开发实战手册(二)

    F5 rest api 各对象使用方式详解 本篇文章介绍rest api接口下Collection.Resource.Subcollections.SubResource的各种使用方法.如果您不了解这 ...

  6. MindSpore循环神经网络

    MindSpore循环神经网络 一. 神经网络的组成 神经元模型:首先简单的了解以下构成神经网络的最基础单元:神经元.每个神经元与其它神经元相连,处于激活状态时,就会向相连的神经元发送相应信号.从而改 ...

  7. 用TensorRT针对AArch64用户的交叉编译示例

    用TensorRT针对AArch64用户的交叉编译示例 以下介绍如何在x86_64linux下为AArch64 QNX和Linux平台交叉编译TensorRT示例. 2.1. Prerequisite ...

  8. 基于区域的CNN(R-CNN)

    基于区域的CNN(R-CNN) Region-based CNNs (R-CNNs) 基于区域的卷积神经网络或具有CNN特征的区域(R-CNN)是一种将深度模型应用于目标检测的开创性方法.在本节中,将 ...

  9. 反应式系统实现MQTT客户机

    反应式系统实现MQTT客户机 Implementing an MQTT client for reactive systems MQTT Reactive是从LiamBindle的MQTT-C库派生的 ...

  10. 运用iGuard防御ADS权限维持

    权限维持是一门庞大的学问,当攻击者在入侵服务器获得主机权限后,往往会想尽办法隐藏其入侵途径以维持权限.权限维持的一般手段包括构造文件包含漏洞.构造远程任意代码执行漏洞.构造SQL注入点.利用系统自启动 ...