Java 锁(学习笔记)
关于Java 锁的知识整理与回顾(个人笔记):
锁有哪些,分别用来干嘛?
Java实现锁有两种方式,synchronized关键字和Lock
(1)Lock(可判断锁状态)
Lock是基于JDK层面实现。Lock的实现主要有ReentrantLock、ReadLock和WriteLock(引出锁分类:)
①乐观锁/悲观锁:
乐观锁认为读多写少,乐观的认为拿数据时,不会改数据,所以不会上锁,而在更新数据时才会判断有无数据更新。悲观锁悲观的认为,写多,拿数据时先设定数据被修改了,每次在读写数据时都会上锁。
②公平锁/非公平锁:
ReentrantLock在构造函数中提供是否公平锁的初始化方式(默认是非公平锁,就是说可以变成公平锁。即他和synchronized不同之处之一):
public ReentrantLock() {
sync = new NonfairSync();
}
public ReentrantLock(boolean fair) {
sync = fair ? new FairSync() : new NonfairSync();
}
非公平锁不按套路出牌,有可能造成“饥饿”现象,但是它的实际执行效率、吞吐量要高于公平锁。
③独享锁/共享锁
独享锁是指该锁一次只能被一个线程所持有 (ReentrantLock、 Synchronized),共享锁反之(ReadWriteLock)。
④互斥锁/读写锁(ReadWriteLock)
互斥锁/读写锁像是独享锁/共享锁的具体的实现。(从字面意思就解释很清楚了)
⑤可重入锁
指同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁(ReentrantLock和Synchronized)。可重入锁可一定程度避免死锁。
⑥自旋锁
自旋锁是指尝试获取锁的线程不会阻塞,而是采用循环的方式尝试获取锁。“采用循环的方式”说明要一直占用CPU资源,浪费啊。在判断持有锁的线程会在很短的时间释放锁,用它就划算了,不用上下文来回切换了。
⑦偏向锁/轻量级锁/重量级锁
这是jdk1.6中对Synchronized锁做的优化,对象头在不同锁状态下的标志位存储。
偏向锁:加锁/解锁开销少,适用于只有一个线程访问同步块场景;轻量级锁:竞争线程不会堵塞,追求响应速度时用它;重量级锁:线程竞争不使用自旋,不会消耗CPU,吞吐量大。(尽量先考虑使用轻量级锁)
(2)synchronized(不可判断锁状态):
synchronized基于JVM层面实现。synchronized可以把任意的非Null的对象当作琐,它是非公平锁(且无法变成公平锁)、独享的可重入的悲观锁。使用synchronized比较省事儿,但是它是一个重量级操作,需要调用操作系统相关接口,性能较低,锁开销可能较大。
同时,synchronized它在不断的被优化,在JDK1.5之后synchronized引入了偏向锁,轻量级锁和重量级锁,java 6有适应自旋、锁粗化、偏向锁等,之后还设置一堆标记位,减少获得锁和释放锁带来的性能消耗,锁开销小了,效率高了。
Java 锁(学习笔记)的更多相关文章
- java多线程学习笔记——详细
一.线程类 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中, ...
- Android(java)学习笔记71:生产者和消费者之等待唤醒机制
1. 首先我们根据梳理我们之前Android(java)学习笔记70中关于生产者和消费者程序思路: 2. 下面我们就要重点介绍这个等待唤醒机制: (1)第一步:还是先通过代码体现出等待唤醒机制 pac ...
- JAVA多线程学习笔记(1)
JAVA多线程学习笔记(1) 由于笔者使用markdown格式书写,后续copy到blog可能存在格式不美观的问题,本文的.mk文件已经上传到个人的github,会进行同步更新.github传送门 一 ...
- Android(java)学习笔记11:生产者和消费者之等待唤醒机制
1. 首先我们根据梳理我们之前Android(java)学习笔记70中,关于生产者和消费者程序思路: 2. 下面我们就要重点介绍这个等待唤醒机制: (1)第一步:还是先通过代码体现出等待唤醒机制 下面 ...
- Java NIO学习笔记
Java NIO学习笔记 一 基本概念 IO 是主存和外部设备 ( 硬盘.终端和网络等 ) 拷贝数据的过程. IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成. 所有语言运行时系统提供执 ...
- Java多线程学习笔记(一)——多线程实现和安全问题
1. 线程.进程.多线程: 进程是正在执行的程序,线程是进程中的代码执行,多线程就是在一个进程中有多个线程同时执行不同的任务,就像QQ,既可以开视频,又可以同时打字聊天. 2.线程的特点: 1.运行任 ...
- Java NIO 学习笔记(六)----异步文件通道 AsynchronousFileChannel
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- 尚学堂JAVA基础学习笔记
目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...
- 20145213《Java程序设计学习笔记》第六周学习总结
20145213<Java程序设计学习笔记>第六周学习总结 说在前面的话 上篇博客中娄老师指出我因为数据结构基础薄弱,才导致对第九章内容浅尝遏止地认知.在这里我还要自我批评一下,其实我事后 ...
- [原创]java WEB学习笔记95:Hibernate 目录
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
随机推荐
- setdefault函数的用法及理解
setdefault函数的用法及理解 dict.setdefault(key, default=None) 功能:如果键不存在于字典中,将会添加该键并将default的值设为该键的默认值,如果键存在于 ...
- redis源码分析(三)--rdb持久化
Redis rdb持久化 Redis支持两种持久化方式:rdb与aof.rdb将一个节点上的内存数据序列化后存储到磁盘中,序列化的数据以尽可能节约空间的方式存储,并非完全的ascii表示.它的优点在于 ...
- 【实战经验】--Xilinx--IPcore--MCB(DDR3)运用
1.背景与介绍 1)在导师安排的新的任务中,用到了一块2G大小的DDR3(MT41K128M16JT-107).本打算像之前用SDRAM一样自己写初始化,读写模块,但是师兄跟我说可以用Xilinx自带 ...
- HTML5+规范:Geolocation(管理设备位置信息) 定位
Geolocation模块管理设备位置信息,用于获取地理位置信息,如经度.纬度等.通过plus.geolocation可获取设备位置管理对象.虽然W3C已经提供标准API获取位置信息,但在某些平台存在 ...
- IDEA设置虚拟机参数
第一步:打开“Run->Edit Configurations”菜单 第二步:选择“VM Options”选项,输入你要设置的VM参数 第三步:点击“OK”.“Apply”后设置完成
- 给自己看的Cache,三段代码
此篇是我记录代码的一个草稿,不是一篇正式的博文,误点的别介意啊. 公司的框架中Cache实现文件: (1)CacheUtil.cs using System.Collections.Generic; ...
- 2019 唯品会java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.唯品会等公司offer,岗位是Java后端开发,因为发展原因最终选择去了唯品会,入职一年时间了,也成为了面试官 ...
- QueryDSL-JPA
QueryDSL-JPA QueryDSL简介 官网 1 QueryDSL仅仅是一个通用的查询框架,专注于通过Java API构建类型安全的SQL查询. 2 Querydsl可以通过一组通用的查询AP ...
- SQL Injection (Blind)
Low级别基于布尔的盲注思路 1.判断是否存在注入,注入是字符型还是数字型 2.猜解当前数据库名 3.猜解数据库中的表名 4.猜解表中的字段名 5.猜解数据 判断是否有sql注入 输入1.1’ and ...
- 【开发工具】- Java开发必知工具
压力测试工具_JMeter 作用 1.能够对HTTP和FTP服务器进行压力和性能测试, 也可以对任何数据库进行同样的测试(通过JDBC). 2.完全的可移植性和100% 纯java. 3.完全 Swi ...