`
keating
  • 浏览: 169973 次
  • 性别: Icon_minigender_1
  • 来自: weihai
社区版块
存档分类
最新评论

附注 OF 《怎么写,程序才能死锁?》

    博客分类:
  • Java
阅读更多
这只是一篇附注,请看博客文章 怎么写,程序才能死锁? http://keating.iteye.com/blog/983365

参考1,线程死锁

Thread1Thread2
目的获取i获取j
步骤获取i获取j
等待j被释放,获取j等待i被释放,获取i
释放i释放j


public class NewClass {

    boolean i = false;
    boolean j = false;

    public void begin() {
        Thread t1 = new Thread(new Thread1());
        Thread t2 = new Thread(new Thread2());
        t1.start();
        t2.start();
    }

    public static void main(String[] args) {
        new NewClass().begin();
    }

    class Thread1 implements Runnable {

        /**
         * 目的:获取j
         *
         * 步骤:
         * 获取i,
         * 等待j被释放,获取j
         * 释放i
         */
        public void run() {
            // 获取i
            i = true;

            // 休息一下,让另一个线程充分占有j
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }

            // 等待j被释放,获取j
            while (j) {
            }
            j = true;

            // 释放i
            i = false;
        }
    }

    class Thread2 implements Runnable {

        /**
         * 目的:获取i
         *
         * 步骤:
         * 获取j,
         * 等待i被释放,获取i
         * 释放j
         */
        public void run() {
            // 获取j
            j = true;

            // 等待i被释放,获取i
            while (i) {
            }
            i = true;

            // 释放j
            j = false;
        }
    }
}


参考2,DatabaseConnection类

public class DatabaseConnection {

    private Connection con = null;
    private Statement stat = null;
    private PreparedStatement pstat = null;
    private ResultSet rs = null;

    public Connection con () {
        return con;
    }

    private void createConnection() throws Exception {
        try {
            try {
                Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
            } catch (InstantiationException ex) {
                Logger.getLogger(DatabaseConnection.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IllegalAccessException ex) {
                Logger.getLogger(DatabaseConnection.class.getName()).log(Level.SEVERE, null, ex);
            }
            StringBuilder sd = new StringBuilder("jdbc:sqlserver://");
            sd.append("localhost:1433;DatabaseName=");
            sd.append("FWDMS");//database name
            String url = sd.toString();
            DriverManager.setLoginTimeout(10);//设置连接超时为10秒
            con = DriverManager.getConnection(url, "sa", "sa");
        } catch (Exception ex) {
            throw new Exception(ex.getMessage());
        }
    }

    public static DatabaseConnection newInstance() throws Exception {
        DatabaseConnection dc = new DatabaseConnection();
        dc.createConnection();
        return dc;
    }

    public ResultSet query(String sql) {
        try {
            stat = con.createStatement();
            rs = stat.executeQuery(sql);
        } catch (Exception ex) {
            Logger.getLogger(DatabaseConnection.class.getName()).log(Level.SEVERE, null, ex);
        }
        return rs;
    }

    public void update(String sql) {
        try {
            stat = con.createStatement();
            stat.executeUpdate(sql);
        } catch (Exception ex) {
            Logger.getLogger(DatabaseConnection.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void update(String sql, String[] args) {
        try {
            pstat = con.prepareStatement(sql);
            for (int i = 0; i < args.length; i++) {
                pstat.setString(i + 1, args[i]);
            }
            pstat.executeUpdate();
        } catch (Exception ex) {
            Logger.getLogger(DatabaseConnection.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void close() {
        //check null,then close rs,stat,pstat and con.
        try {
            if (rs != null) {
                rs.close();
            }
            if (stat != null) {
                stat.close();
            }
            if (pstat != null) {
                pstat.close();
            }
            if (con != null) {
                con.close();
            }
        } catch (SQLException ex) {
            Logger.getLogger(DatabaseConnection.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
分享到:
评论

相关推荐

    C#进程监控,监视程序是否崩溃、死锁?

    本文将深入探讨如何使用C#来监控进程状态,包括监测程序是否崩溃和发生死锁,并讨论如何通过托盘图标进行无声的后台监控。 一、C#进程监控基础 在C#中,`System.Diagnostics`命名空间提供了一个名为`Process`的类...

    35丨记一次线上SQL死锁事故:如何避免死锁?.html

    35丨记一次线上SQL死锁事故:如何避免死锁?.html

    如何理解3D动画中的欧拉角以及死锁?.zip

    如何理解3D动画中的欧拉角以及死锁?以及包含了自动驾驶学习资料集: 涵盖感知,规划和控制,ADAS,传感器; 1. apollo相关的技术教程和文档; 2. adas(高级辅助驾驶)算法设计(例如AEB,ACC,LKA等) 3. 自动驾驶...

    什么是死锁,如何避免死锁?Java死锁详解

    理解死锁的概念对于编写高效、安全的并发程序至关重要。 在Java中,死锁的实例可以通过一个简单的代码示例来解释。考虑以下情况: ```java public class DeadThread { private Thread thread1; public Dead...

    jKill#basic-notes#什么情况下会发生死锁,如何解决死锁?1

    会出现死锁的情况产生死锁的4个必要条件:互斥:资源一次只允许一个session访问,其他session需要等待正在访问的事务结束。如何解决死锁通用的死锁解决方案

    数据库 死锁的解决

    这类死锁通常是由于程序设计不当导致的,因此需要通过调整程序逻辑来解决。具体措施包括: 1. **减少资源锁定:** 尽可能避免同时锁定两个资源,减少并发操作中的锁冲突。 2. **统一锁定顺序:** 如果确实需要同时...

    基于java的开发源码-多线程程序死锁检查 JCarder.zip

    基于java的开发源码-多线程程序死锁检查 JCarder.zip 基于java的开发源码-多线程程序死锁检查 JCarder.zip 基于java的开发源码-多线程程序死锁检查 JCarder.zip 基于java的开发源码-多线程程序死锁检查 JCarder.zip ...

    Java多线程程序死锁检查 JCarder

    JCarder是Java中用于检测多线程程序死锁的一款工具,它可以帮助开发者识别和避免死锁问题,提升程序的稳定性和效率。 首先,我们需要理解死锁的基本概念。在Java中,死锁通常发生在多个线程之间,每个线程持有某些...

    操作系统常用的死锁程序

    在这个程序示例中,我们看到一个模拟哲学家进餐问题的场景,这是经典的死锁例子,用于阐述操作系统中的并发控制和死锁预防策略。让我们深入探讨这个程序的各个组成部分以及它们与操作系统死锁相关的知识点。 首先,...

    一个简单的和死锁有关的程序

    标题:一个简单的和死锁有关的程序 描述与分析: 本程序通过两个`DeadThread`线程类实例和两个`Test`对象实例演示了死锁(deadlock)现象。死锁是多线程编程中常见的一种问题,发生在多个线程相互等待对方释放资源...

    mysql死锁的一些案例

    MySQL数据库在处理并发事务时,可能会遇到一种特殊的情况,即死锁。死锁是指两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉它们将无法继续执行。死锁是数据库系统中常见的问题,...

    操作系统实验报告--模拟死锁避免程序

    - 理解如何在程序中表示这些信息,如使用数组或列表来存储这些数值。 2. **输入每个进程对每类资源的最大需求量、已分配量,计算剩余需求量以及系统每类资源的当前剩余量** - **知识点**: - 进程对资源的需求...

    死锁检测源代码

    死锁检测源代码

    进程线程及死锁

    进程、线程、死锁和POSIX规范的系统调用 进程是操作系统中一个独立的执行单元,它拥有自己的虚拟地址空间和系统资源。线程是轻量级的进程,它共享同一个进程的虚拟地址空间和系统资源。理解进程和线程的概念对于...

    sql表死锁解决办法

    一、什么是 SQL 表死锁? SQL 表死锁是指在 SQL Server 中,一个或多个进程无法访问某个表或库,因为这些进程都在等待某个资源,而这个资源又被其他进程占用着。这种情况下,SQL Server 会超时,导致表或者库不可...

    微软SerialPort秘籍[SerialPort为什么死锁程序的分析]

    《微软SerialPort秘籍——深度剖析串口死锁与程序优化》 在.NET框架中,SerialPort类为我们提供了与串行端口进行通信的能力。然而,对于初学者和经验丰富的开发者来说,它隐藏的一些陷阱可能导致程序出现意想不到的...

    SQL Server死锁的解除方法

    7. 使用select 工作站名=hostname, 应用程序名=program_name, 工作站进程ID=hostprocess, 域名=nt_domain, 网卡地址=net_address命令来查询死锁的进程信息。 在解决SQL Server死锁时,需要注意以下几点: 1. 首先...

    Java多线程程序死锁检查 JCarder.7z

    JCarder是一款用于检测Java多线程程序中死锁问题的工具,它可以帮助开发者识别和解决这类问题,确保程序的稳定运行。 首先,了解Java多线程中的死锁。在Java中,死锁通常发生在多个线程各自持有某些资源,并且都...

Global site tag (gtag.js) - Google Analytics