首页 > 编程语言 >[Java手撕]手撕死锁

[Java手撕]手撕死锁

时间:2024-09-19 14:25:33浏览次数:1  
标签:Java Thread System lock2 死锁 lock1 new out

一种不安全的写法

public class Main {

    public static final Object lock1 = new Object();
    public static final Object lock2 = new Object();

    public static void main(String[] args) {

        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock1) {
                    System.out.println(Thread.currentThread().getName() + "已经获取了lock1");
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    synchronized (lock2) {
                        System.out.println(Thread.currentThread().getName() + "已经获取了lock2");
                    }
                }
            }
        });

        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock2) {
                    System.out.println(Thread.currentThread().getName() + "已经获取了lock2");
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    synchronized (lock1) {
                        System.out.println(Thread.currentThread().getName() + "已经获取了lock1");
                    }
                }
            }
        });

        thread1.start();
        thread2.start();
    }
}

一种安全的写法

import java.io.*;
import java.sql.Time;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors;

public class Main {

    public static final ReentrantLock lock1 = new ReentrantLock();
    public static final ReentrantLock lock2 = new ReentrantLock();

    public static void main(String[] args) {

        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {

                try {
                    // 尝试获取 lock1,等待2秒
                    if (lock1.tryLock(2, TimeUnit.SECONDS)) {
                        try {
                            System.out.println("Thread1: Holding lock1...");
                            // 尝试获取 lock2,等待2秒
                            if (lock2.tryLock(2, TimeUnit.SECONDS)) {
                                try {
                                    System.out.println("Thread1: Holding lock1 & lock2...");
                                    // Critical section
                                } finally {
                                    lock2.unlock();
                                }
                            } else {
                                System.out.println("Thread1: Could not acquire lock2, releasing lock1...");
                            }
                        } finally {
                            lock1.unlock();
                            System.out.println("Thread1: releasing lock1...");
                        }
                    } else {
                        System.out.println("Thread1: Could not acquire lock1...");
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }


            }
        });

        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {

                try {
                    // 尝试获取 lock2,等待2秒
                    if (lock2.tryLock(2, TimeUnit.SECONDS)) {
                        try {
                            System.out.println("Thread2: Holding lock2...");
                            // 尝试获取 lock1,等待2秒
                            if (lock1.tryLock(2, TimeUnit.SECONDS)) {
                                try {
                                    System.out.println("Thread2: Holding lock2 & lock1...");
                                    // Critical section
                                } finally {
                                    lock1.unlock();
                                }
                            } else {
                                System.out.println("Thread2: Could not acquire lock1, releasing lock2...");
                            }
                        } finally {
                            lock2.unlock();
                            System.out.println("Thread2: releasing lock2...");
                        }
                    } else {
                        System.out.println("Thread2: Could not acquire lock2...");
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        });

        thread1.start();
        thread2.start();
    }
}

标签:Java,Thread,System,lock2,死锁,lock1,new,out
From: https://www.cnblogs.com/DCFV/p/18420440

相关文章

  • 【JAVA开源】基于Vue和SpringBoot的购物商城网站
    本文项目编号T032,文末自助获取源码\color{red}{T032,文末自助获取源码}......
  • 【JAVA开源】基于Vue和SpringBoot的校园美食分享平台
    本文项目编号T033,文末自助获取源码\color{red}{T033,文末自助获取源码}......
  • 【JAVA开源】基于Vue和SpringBoot的蜗牛兼职平台
    本文项目编号T034,文末自助获取源码\color{red}{T034,文末自助获取源码}......
  • java 弧度转多线段
    一:概述弧度和线段是数学和计算机图形学中的基本概念,它们在处理图形变换、动画制作以及游戏开发等领域中有着广泛的应用。在Java中,我们可以通过多种方式将弧度转换为多线段,以实现不同的图形效果。本文将介绍几种不同的方法,并提供实际的案例分析。二:具体说明<1>基本概念弧度:表示一个......
  • 2024年全网最强Java八股文合集
    1.ArrayList和LinkedList的区别 ArratList的底层使用动态数组,默认容量为10,当元素数量到达容量时,生成一个新的数组,大小为前一次的1.5倍,然后将原来的数组copy过来;因为数组在内存中是连续的地址,所以ArrayList查找数据更快,由于扩容机制添加数据效率更低LinkedList的底层使用链表......
  • Java SE 23 新增特性4C
    JavaSE23新增特性作者:Grey原文地址:博客园:JavaSE23新增特性CSDN:JavaSE23新增特性源码源仓库:Github:java_new_featuresPrimitiveTypesinPatterns,instanceof,andswitch(预览功能)通过instanceof和switch,我们可以检查对象是否属于特定类型,如果是,则将该对......
  • java String转List<Map>
    StringrefinGrid=bgtbalanceMap.get("grid");JSONArrayproIdsJsonArr=JSONArray.fromObject(refinGrid);List<Map>list=(List<Map>)JSONArray.toCollection(proIdsJsonArr,Map.class);//list中添加值for(Mapmap:list){......
  • LangChain4j炸裂!Java开发者打造AI应用从未如此简单
    LangChain4j的目标是简化将大语言模型(LLM)集成到Java应用程序中的过程。1实现方式1.1标准化APILLM提供商(如OpenAI或GoogleVertexAI)和向量嵌入存储(如Pinecone或Milvus)使用专有API。LangChain4j提供了标准化API,避免了每次都需要学习和实现特定API的麻烦。要试......
  • 【Java计算机毕设选题】2025毕业设计选题100+ 通过率最高的选题推荐
    文章目录前言选题介绍选题推荐我的优势源码获取前言❤️博主简介:全网累计客户1000+,培训机构讲师、全栈开发工程师、知乎/小红书优秀作者、腾讯云/阿里云VIP客户、专注Java、小程序、安卓领域和毕业项目开发❤️同学们可以先收藏起来,以免迷路,关于毕设选题,项目和论文的......
  • 【Java基础】ThreadLocal<LoginUser>:存储登录用户信息
    ......