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

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

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 分钟前
多相机微秒级对齐:硬件触发 vs PTP(IEEE 1588)方案实战对比
开发语言·人工智能·数码相机·机器学习·计算机视觉·视觉检测·机器视觉
都叫我大帅哥20 分钟前
给 Java 程序员的 CSRF 攻击详解:从原理到防御实战
java
江南十四行29 分钟前
Spring框架核心(上)——IoC控制反转与DI依赖注入详解
java·后端·spring
fb_123451 小时前
Linux磁盘分区从入门到实操:MBR_GPT全解析+分区工具实战指南
java·linux·gpt
初级代码游戏1 小时前
iOS开发 Swift 速记2:三种集合类型 Array Set Dictionary
开发语言·ios·swift
码智社2 小时前
JSON 零基础到资深全体系教程
java·json
峥嵘life3 小时前
Android WiFi 热点 Channel 信道 和 Frequency 频率 转换总结
android·开发语言
wgego3 小时前
基础的反序列化一些总结(php和java)
java·开发语言·笔记
冻柠檬飞冰走茶4 小时前
PTA基础编程题目集 7-8超速判断(C++语言实现)
开发语言·数据结构·c++·算法
机建狂魔4 小时前
Codex 接入第三方模型 API 实战:以 Mimo 为例
java·服务器·数据库·ai·ai编程·codex