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();
    }
    }




  • 相关阅读:
    NetBeans 时事通讯(刊号 # 147 May 18, 2011)
    NetBeans 时事通讯(刊号 # 146 May 13, 2011)
    准备入职支付宝
    NetBeans 时事通讯(刊号 # 145 May 05, 2011)
    GAE 博客——B3log Solo 0.2.6 正式版发布了!
    用C语言实现一个简单的HTTP客户端(HTTP Client)
    Grack Ruby/Rack Git SmartHTTP Server Handler
    Cpy
    pyhttp 用Python演示Web服务器/客户端对HTTP协议的解析
    用C语法来写Python代码
  • 原文地址:https://www.cnblogs.com/shuaifing/p/10616066.html
Copyright © 2011-2022 走看看