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

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

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 进程号

相关推荐
茉莉玫瑰花茶24 分钟前
GO [ 方法 ]
开发语言·后端·golang
狗凯之家源码网1 小时前
微博图床 PHP 系统搭建与实战应用指南
android·开发语言·php
自强的小白1 小时前
核心功能(Service接口)
java·mybatis
乌暮2 小时前
深入理解 Java 泛型:把「万能盒子」用对、用稳
java·开发语言·后端·学习
大猫和小黄3 小时前
深入理解 Java Optional:从设计哲学到工程实战
java
数据库百宝箱3 小时前
rum&gin索引对比
java·数据库·gin
2601_962218613 小时前
C语言中三种库的编译和使用方法
开发语言·c++
传奇开心果编程3 小时前
中庸、有容、破执:仓颉编程语言的中华智慧结晶——三重哲学境界思辨
开发语言·华为·开源·软件工程
yychen_java3 小时前
第六篇:Spring AI 实战:将 Java 业务接口封装成企业级 MCP Server
java·人工智能·spring