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

Posted zhangphil

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于Semaphore替换多线程synchronized解决并发环境死锁,Java的主要内容,如果未能解决你的问题,请参考以下文章

关于Semaphore

ReentrantLock替换synchronized解决多线程并发死锁,Java

ReentrantLock替换synchronized解决多线程并发死锁,Java

多线程知识

在一般程序开发中可以使用synchronized同步多线程

多线程开发注意问题