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




  • 相关阅读:
    asp.net 下载文件
    Asp.Net中用iframe解决模态窗口文件下载问题(转)
    如何获取网站的根目录(js或者asp.net)
    java中日期加减计算(转)
    网页颜色选择器
    信仰基督教的好处
    基因芯片数据字段
    独立分量分析(ICA)
    GenePix® Pro 文件格式
    OBO文件中的标签的含义/意思/意义
  • 原文地址:https://www.cnblogs.com/shuaifing/p/10616066.html
Copyright © 2020-2023  润新知