12 各种锁的理解
时间:2021-08-23
本文章向大家介绍12 各种锁的理解,主要包括12 各种锁的理解使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
各种锁
1、公平锁、非公平锁
公平锁:非常公平,不能插队,必须先来后到
非公平锁:非常不公平,可以插队,(默认都是非公平的)
public ReentrantLock() {
sync = new NonfairSync();
}
public ReentrantLock(boolean fair) {
sync = fair ? new FairSync() : new NonfairSync();
}
Lock lock = new ReentrantLock(true);
2、可重入锁
可重入锁(递归锁)
拿到了外面的锁,就可以拿到里面的锁(自动获得)
synchronized版
public class Demo01 {
public static void main(String[] args) {
Phone phone = new Phone();
new Thread(()->{
phone.send();
},"A").start();
new Thread(()->{
phone.send();
},"B").start();
}
}
class Phone{
public synchronized void send(){
System.out.println(Thread.currentThread().getName()+"send");
call();
}
public synchronized void call() {
System.out.println(Thread.currentThread().getName() + "call");
}
}
lock版
public class Demo02 {
public static void main(String[] args) {
Phone2 phone = new Phone2();
new Thread(()->{
phone.send();
},"A").start();
new Thread(()->{
phone.send();
},"B").start();
}
}
class Phone2{
Lock lock = new ReentrantLock();
public void send(){
lock.lock();//锁必须配对 否则就会死在里面
try {
System.out.println(Thread.currentThread().getName()+"send");
call();
} catch (Exception e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void call() {
lock.lock();
try {
System.out.println(Thread.currentThread().getName() + "call");
} catch (Exception e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
3、自旋锁
spinlock
public class SpinLock {
//Thread null
AtomicReference<Thread> atomicReference = new AtomicReference<>();
//加锁
public void myLock(){
Thread thread = Thread.currentThread();
System.out.println(Thread.currentThread().getName()+"==> myLock");
while (!atomicReference.compareAndSet(null,thread));
}
//解锁
public void myUnLock() {
Thread thread = Thread.currentThread();
System.out.println(Thread.currentThread().getName()+"==> myLock");
atomicReference.compareAndSet(thread,null);
}
}
4、死锁
public class DeadLock {
public static void main(String[] args) {
String lockA = "A";
String lockB = "B";
new Thread(new MyThread(lockA,lockB),"t1").start();
new Thread(new MyThread(lockB,lockA),"t2").start();
}
}
class MyThread implements Runnable{
private String lockA;
private String lockB;
public MyThread(String lockA,String lockB){
this.lockA = lockA;
this.lockA = lockB;
}
@Override
public void run() {
synchronized (lockA){
System.out.println(Thread.currentThread().getName()+"lock"+lockA+"=>"+lockB);
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockB){
System.out.println(Thread.currentThread().getName()+"lock"+lockB+"=>"+lockA);
}
}
}
}
怎么排除死锁
- 使用
jsp-l
定位进程号 到idea terminal 输入 - 使用
jstack 进程号
面试,工作中!排查问题:
- 日志
- 堆栈
原文地址:https://www.cnblogs.com/flypigggg/p/15177517.html
- Oracle BIEE (Business Intelligence) 11g 11.1.1.6.0 学习(2)RPD资料档案库创建
- Oracle BIEE (Business Intelligence) 11g 11.1.1.6.0 学习(3)创建一个简单的分析
- 请查收!这里有一封信鸽传给您的信
- Oracle BIEE (Business Intelligence) 11g 11.1.1.6.0 学习(4)创建多维钻取分析
- silverlight:RadMaskedTextBox设置MaskType="Numeric"及Mask="n"时的一个bug
- 微信里面最神秘的功能,你知道吗?
- 以大数据之名,变身!——In big data we trust
- 90%家长都不知道关于少儿编程的这些疑题!
- 常用SQL语句和语法汇总
- Python学习笔记1——斐波那契数列
- 视觉传感器几大技术要点详解!
- Spark之搜狗日志查询实战
- 区块链与数字货币是什么关系呢?
- 保存数据到MySql数据库——我用scrapy写爬虫(二)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP实现时间日期友好显示实现代码
- AndroidStudio插件GsonFormat之Json快速转换JavaBean教程
- android studio错误: 常量字符串过长的解决方式
- Android Shader着色器/渲染器的用法解析
- PHP实现的文件浏览器功能简单示例
- Laravel中正确地返回HTTP状态码方法示例
- Android 实现抖音头像底部弹框效果的实例代码
- Android Studio修改Log信息颜色的实现
- Android 之BottomsheetDialogFragment仿抖音评论底部弹出对话框效果(实例代码)
- Yii框架的路由配置方法分析
- Android 购物车加减功能的实现代码
- Yii框架函数简单用法分析
- PHP读取XML文件的方法实例总结【DOMDocument及simplexml方法】
- 浅析PHP7 的垃圾回收机制
- android BottomSheetDialog新控件解析实现知乎评论列表效果(实例代码)