当前位置: 首页 > article >正文

面试手撕-多线程死锁

使用多线程的方式

继承 Thread

实现 Runnable 接口

实现 Callable 接口

  • FutureTask
  • CompletableFuture

使用 线程池

public class ArraySum {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        // 初始化一个长度为1000的数组
        int[] array = new int[100];
        for (int i = 0; i < array.length; i++) {
            array[i] = i + 1;  // 数组元素为1到100
        }

        // 创建线程池,最多使用10个线程
        ExecutorService executorService = Executors.newFixedThreadPool(10);

        // 每个线程计算的部分长度
        int chunkSize = array.length / 10;

        // 使用一个 AtomicInteger 来确保线程安全的累加
        AtomicInteger totalSum = new AtomicInteger(0);

        // 创建任务并提交给线程池
        for (int i = 0; i < 10; i++) {
            final int start = i * chunkSize;
            final int end = (i + 1) * chunkSize;
            executorService.submit(() -> {
                int partialSum = 0;
                for (int j = start; j < end; j++) {
                    partialSum += array[j];
                }
                // 通过 AtomicInteger 将部分和添加到总和
                totalSum.addAndGet(partialSum);
            });
        }

        // 等待所有线程执行完毕
        executorService.shutdown();

        // 打印最终结果
        System.out.println("Total Sum: " + totalSum.get());
    }
}

用Java写一段死锁的代码

死锁
● 预防死锁
● 避免死锁
● 检测死锁
● 解除死锁

public class Deadlock {

    // 资源A和资源B
    private static final Object resourceA = new Object();
    private static final Object resourceB = new Object();

    public static void main(String[] args) {
        // 创建线程1,试图先获取资源A再获取资源B
        Thread thread1 = new Thread(() -> {
            synchronized (resourceA) {
                System.out.println("Thread 1: Locked resource A");

                // 模拟一些工作
                try { Thread.sleep(100); } catch (InterruptedException e) {}

                synchronized (resourceB) {
                    System.out.println("Thread 1: Locked resource B");
                }
            }
        });

        // 创建线程2,试图先获取资源B再获取资源A
        Thread thread2 = new Thread(() -> {
            synchronized (resourceB) {
                System.out.println("Thread 2: Locked resource B");

                // 模拟一些工作
                try { Thread.sleep(100); } catch (InterruptedException e) {}

                synchronized (resourceA) {
                    System.out.println("Thread 2: Locked resource A");
                }
            }
        });

        // 启动线程
        thread1.start();
        thread2.start();
    }
}

http://www.kler.cn/a/472424.html

相关文章:

  • Java语法总结
  • 源代码编译安装X11及相关库、vim,配置vim(2)
  • 快速入门Spring Cloud Alibaba,轻松玩转微服务
  • IDEA 字符串拼接符号“+”位于下一行的前面,而不是当前行的末尾
  • Ubuntu 下载安装 kibana8.7.1
  • C#使用MVC框架创建WebApi服务接口
  • 升级 Spring Boot 3 配置讲解 —— 为何 SpringBoot3 淘汰了 JDK8?
  • 探索大型语言模型新架构:从 MoE 到 MoA
  • 浙江生易达自控科技:品质与实力的象征
  • idea 远程docker 本地需要安装docker吗
  • 阿里云代理商热销产品推荐
  • 05-Linux系统编程之进程(下)
  • Transformer深度学习实战TT100K中国交通标志识别
  • 2025第2周 | JavaScript中的函数的参数默认值和剩余参数
  • Excel | 空格分隔的行怎么导入excel?
  • 【论文+源码】创建一个基于Spring Boot的体育场管理系统
  • Golang开发-案例整理汇总
  • 如何优化 Linux 服务器的磁盘 I/O 性能
  • flink state源码解析
  • 鸿蒙APP之从开发到发布的一点心得
  • 【Elasticsearch】索引创建、修改、删除与查看
  • Android UI:View:Scroll
  • 68.基于SpringBoot + Vue实现的前后端分离-心灵治愈交流平台系统(项目 + 论文PPT)
  • 哦?将文本转换为专业流程图的终极解决方案?
  • 监控系统zabbix1.0
  • vulnhub靶场【DC系列】之4