zoukankan      html  css  js  c++  java
  • 浅谈java中死锁问题

    知识点:死锁的产生、死锁的实例

    一:死锁的产生

    我们在解决多线程共享资源的线程同步问题时,会使用synchronized关键字修饰方法或者通过Lock加锁方式修饰方法、代码块,防止多个线程访问统一资源产生的线程安全问题。但是当线程X持有锁A,等待锁B,而线程Y此时持有锁B,等待锁A时,就会出现X,Y两个线程互相等待的情况,这种情况就是死锁。

    二:死锁实例

    实例1  在下面的简单实例中,我们同时开启两个线程X、Y,线程X加sb1锁后,会在再次加sb2锁,线程Y加sb2锁后,会在再次加sb1锁,当线程X加sb1锁后,会在再次加sb2锁,同时线程Y加sb2锁后,再次等待X持有的sb1锁时,就会出现相互等待,便产生了死锁问题。

    public class TestDeadLock {

    static StringBuffer sb1=new StringBuffer(); //声明两个静态StringBuffer对象实例
    static StringBuffer sb2=new StringBuffer();

    public static void main(String[] args) {
    new Thread(){ //声明两个线程实例,并start()启动线程,线程X
    @Override
    public void run() {
    try {
    Thread.currentThread().sleep(500);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    synchronized (sb1){ //加sb1锁后,向sb1对象加“A”字符串
    sb1.append("A");
    synchronized (sb2){ //加sb2锁后,向sb2对象加“B”字符串
    sb2.append("B");
    System.out.println(sb1);
    System.out.println(sb2);
    }
    }
    }
    }.start();

    new Thread(){ 线程Y
    @Override
    public void run() {
    try {
    Thread.currentThread().sleep(500);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    synchronized (sb2){
    //加sb2锁后,向sb1对象加“C”字符串
    sb1.append("C");
    synchronized (sb1){ //加sb1锁后,向sb1对象加“D”字符串
    sb2.append("D");
    System.out.println(sb1);
    System.out.println(sb2);
    }
    }
    }
    }.start();
    }
    }




  • 相关阅读:
    事务与隔离级别
    使用 Spring Boot 构建 RESTful API
    Dockerfile 指令详解
    Java 函数式编程--流操作
    Java ThreadLocal 的使用与源码解析
    node+express的html页面访问
    node+mysql数据库连接(入门)
    ensp的基础路由命令,接口,下一跳的配置,入门必备
    初识JSP/Severlet技术开发Web应用
    jQuery基础及选择器
  • 原文地址:https://www.cnblogs.com/shuaifing/p/10616066.html
Copyright © 2011-2022 走看看