公平、非公平锁、可重复锁、自旋锁、死锁

复制代码
(无语死了,这破显示字体,一直是小的)

synchronized和lock默认是非公平锁,为了优化速度假如:

A线程需要3s执行完毕,B线程需要1H,肯定先执行A。

lock只需要在构造方法传入true就是公平锁

复制代码
Lock lock=new ReentrantLock(true)

可重复锁则是在锁里面还可以再获取锁(就是递归思想),依次解锁释放

自旋锁就有点流弊了,通过对锁的判断状态,进行自旋:(我也不知道为啥,我用自己一直实现不了,用原子类就可以)

java 复制代码
package com.quxiao.entity;

import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;

public class MyLock {
    AtomicInteger atomicInteger = new AtomicInteger();

    public void lock() {
        //上一个取到锁,赋值为1,释放锁时调用unlock,赋值为0,结束下一个线程的自旋
        while (!atomicInteger.compareAndSet(0, 1)) {

        }
    }

    public void unlock() {
        //释放锁
        atomicInteger.compareAndSet(1, 0);
    }
}

死锁:A等B,B等A(好凄凉,哈哈哈哈哈哈)

java 复制代码
package com.quxiao.controller;


import com.quxiao.entity.MyLock;

import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @program: package1
 * @author: quxiao
 * @create: 2023-09-27 15:22
 **/
public class t3 {
    public static void main(String[] args) {
        final String a = "1";
        final String b = "2";
        new Thread(() -> {
            try {
                new t(a, b);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }, "A").start();
        new Thread(() -> {
            try {
                new t(b, a);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }, "B").start();
    }

    static class t {

        public t(String a, String b) throws InterruptedException {
            synchronized (a) {
                System.out.println(Thread.currentThread().getName() + "a");
                TimeUnit.SECONDS.sleep(2);
                synchronized (b) {
                    System.out.println(Thread.currentThread().getName() + "b");
                }
            }
        }

    }
}

排查办法:

控制台查看进程:

jps -l

然后使用jstack 进程号

相关推荐
莫逸风1 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
从零开始的代码生活_1 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
云小逸1 小时前
【C++ 第七阶段:模板、泛型编程与工程综合详解】
开发语言·c++
z123456789862 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
GIS阵地2 小时前
QgsSingleBandPseudoColorRenderer 完整详解(QGIS 3.40.13 C++)
开发语言·前端·c++·qt·qgis
yaoxin5211232 小时前
470. Java 反射 - Member 接口与 AccessFlag
java·开发语言·python
groundhappy3 小时前
idalib安装和codex ida-mcp配置
linux·开发语言·python
做个文艺程序员3 小时前
Linux第24篇:Java应用监控体系搭建:Prometheus+Grafana可视化运维
java·grafana·prometheus
小钻风33663 小时前
Spring Boot 文件上传详解:深入理解 MultipartFile 的使用与原理
java·开发语言
其美杰布-富贵-李4 小时前
Spring Boot 工程开发全流程说明
java·spring boot·后端