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


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

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

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

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

    Lock lock=new ReentrantLock(true)
    

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

     

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

     

    1. package com.quxiao.entity;
    2. import java.util.concurrent.atomic.AtomicInteger;
    3. import java.util.concurrent.atomic.AtomicReference;
    4. public class MyLock {
    5. AtomicInteger atomicInteger = new AtomicInteger();
    6. public void lock() {
    7. //上一个取到锁,赋值为1,释放锁时调用unlock,赋值为0,结束下一个线程的自旋
    8. while (!atomicInteger.compareAndSet(0, 1)) {
    9. }
    10. }
    11. public void unlock() {
    12. //释放锁
    13. atomicInteger.compareAndSet(1, 0);
    14. }
    15. }

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

    1. package com.quxiao.controller;
    2. import com.quxiao.entity.MyLock;
    3. import java.util.ArrayList;
    4. import java.util.concurrent.TimeUnit;
    5. import java.util.concurrent.locks.Lock;
    6. import java.util.concurrent.locks.ReentrantLock;
    7. /**
    8. * @program: package1
    9. * @author: quxiao
    10. * @create: 2023-09-27 15:22
    11. **/
    12. public class t3 {
    13. public static void main(String[] args) {
    14. final String a = "1";
    15. final String b = "2";
    16. new Thread(() -> {
    17. try {
    18. new t(a, b);
    19. } catch (InterruptedException e) {
    20. throw new RuntimeException(e);
    21. }
    22. }, "A").start();
    23. new Thread(() -> {
    24. try {
    25. new t(b, a);
    26. } catch (InterruptedException e) {
    27. throw new RuntimeException(e);
    28. }
    29. }, "B").start();
    30. }
    31. static class t {
    32. public t(String a, String b) throws InterruptedException {
    33. synchronized (a) {
    34. System.out.println(Thread.currentThread().getName() + "a");
    35. TimeUnit.SECONDS.sleep(2);
    36. synchronized (b) {
    37. System.out.println(Thread.currentThread().getName() + "b");
    38. }
    39. }
    40. }
    41. }
    42. }

    排查办法:

    控制台查看进程:

    jps -l

    然后使用jstack [进程号]

  • 相关阅读:
    数字全息干涉偏振相移实验经验总结
    计算机毕业设计选题推荐-springboot 网上手机销售系统
    驱动开发:PE导出函数与RVA转换
    Linux字符设备驱动开发(二)
    SpringBoot如何实现自动装配
    网络安全-HSRP协议
    linux安装vsftp
    华为机试真题 C++ 实现【执行时长】【GPU算力】
    Cilium v1.12 功能原理解读:ServiceMesh 令人期待
    循迹模式——红外循迹模块使用介绍
  • 原文地址:https://blog.csdn.net/qx020814/article/details/133580412