资讯 小学 初中 高中 语言 会计职称 学历提升 法考 计算机考试 医护考试 建工考试 教育百科
栏目分类:
子分类:
返回
空麓网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
空麓网 > 计算机考试 > 软件开发 > 后端开发 > Java

Semaphore替换多线程synchronized解决并发环境死锁,Java

Java 更新时间: 发布时间: 计算机考试归档 最新发布

Semaphore替换多线程synchronized解决并发环境死锁,Java

Semaphore替换多线程synchronized解决并发环境死锁,Java

 

import java.util.concurrent.Semaphore;

public class MainClass {
    private Semaphore semaphore1 = new Semaphore(1);
    private Semaphore semaphore2 = new Semaphore(1);

    public static void main(String[] args) {
        MainClass mainClass = new MainClass();
        mainClass.demo();
    }

    private void demo() {
        Thread ta = new Thread(new DeadA());
        Thread tb = new Thread(new DeadB());
        ta.start();
        tb.start();
    }

    private class DeadA implements Runnable {
        private String id = "A";

        @Override
        public void run() {
            System.out.println(id + " 申请锁1...");
            try {
                semaphore1.acquire();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println(id + " 获得锁1");
            semaphore1.release();

            System.out.println(id + " 申请锁2...");
            try {
                semaphore2.acquire();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println(id + "获得锁2");
            semaphore2.release();

            System.out.println(id + " 运行结束");
        }
    }

    private class DeadB implements Runnable {
        private String id = "B";

        @Override
        public void run() {
            System.out.println(id + " 申请锁2...");
            try {
                semaphore2.acquire();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println(id + " 获得锁2");
            semaphore2.release();

            System.out.println(id + " 申请锁1...");

            try {
                semaphore1.acquire();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println(id + " 获得锁1");
            semaphore1.release();

            System.out.println(id + " 运行结束");
        }
    }
}

 

输出:

A 申请锁1...
B 申请锁2...
A 获得锁1
B 获得锁2
A 申请锁2...
B 申请锁1...
A获得锁2
B 获得锁1
A 运行结束
B 运行结束

 

 

 

Java多线程并发环境下的synchronized死锁实例_zhangphil的博客-CSDN博客Java并发多线程环境中,造成死锁的最简单的场景是:多线程中的一个线程T_A持有锁L1并且申请试图获得锁L2,而多线程中另外一个线程T_B持有锁L2并且试图申请获得锁L1。线程的锁申请操作是阻塞的,于是造成线程T_A和线程T_B无法正确获得想要的锁,两个线程被阻塞进入死锁状态。https://blog.csdn.net/zhangphil/article/details/127534524

新Java线程Semaphore:并行环境下访问竞争资源控制_zhangphil的博客-CSDN博客新Java线程Semaphore:并行环境下访问竞争资源控制Semaphore是从Java 1.5引入的Java线程新内容。Semaphore实现在线程的竞争资源访问环境下,对资源的访问控制。只有申请(acquire)得到Semaphore的许可证的线程任务可以访问竞争资源。例如: private void test() { // 虽然有很多线程想访问某些资源,但...https://blog.csdn.net/zhangphil/article/details/83410270

 

转载请注明:文章转载自 http://www.konglu.com/
本文地址:http://www.konglu.com/it/1043038.html
免责声明:

我们致力于保护作者版权,注重分享,被刊用文章【Semaphore替换多线程synchronized解决并发环境死锁,Java】因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理,本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们,情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!

我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2023 成都空麓科技有限公司

ICP备案号:蜀ICP备2023000828号-2