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

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

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

相关推荐
jingling55510 分钟前
面试版-前端开发核心知识
开发语言·前端·javascript·vue.js·面试·前端框架
guojl17 分钟前
深度解读jdk8 HashMap设计与源码
java
guojl22 分钟前
深度解读jdk8 ConcurrentHashMap设计与源码
java
m0_6873998429 分钟前
写一个Ununtu C++ 程序,调用ffmpeg API, 来判断一个数字电影的视频文件mxf 是不是Jpeg2000?
开发语言·c++·ffmpeg
爱上语文39 分钟前
Redis基础(5):Redis的Java客户端
java·开发语言·数据库·redis·后端
A~taoker1 小时前
taoker的项目维护(ng服务器)
java·开发语言
萧曵 丶1 小时前
Rust 中的返回类型
开发语言·后端·rust
HGW6891 小时前
基于 Elasticsearch 实现地图点聚合
java·elasticsearch·高德地图
hi星尘1 小时前
深度解析:Java内部类与外部类的交互机制
java·开发语言·交互
看到我,请让我去学习1 小时前
Qt编程-qml操作(js,c++,canvas)
开发语言·qt