死锁

Java:多线程死锁

限于喜欢 提交于 2020-11-21 15:17:55
死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。 产生死锁的原因: 1.因为系统资源不足。 2.进程运行推进的顺序不合适。 3.资源分配不当。 产生死锁的条件: 互斥条件:所谓互斥就是进程在某一时间内独占资源。 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。 简单的来说:死锁就是因为多线程在访问对象的时候,A线程占用了对象object1,又想去占用对象object2,但是此时的object2对象已经被B线程占用,并且B线程又想去占用object2。两个线程同时占用对方想要的对象,但是又不释放自己占有的对象,两个线程互相等待,造成拥塞无法执行下去。 public class LockDemo implements Runnable { private static Object object1 = new Object(); private static Object object2 = new Object(); private int flag = 0; public static void main(String[] args) { LockDemo run0 =

MySQL中的行级锁,表级锁,页级锁

风流意气都作罢 提交于 2020-01-07 05:14:15
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足。 在 数据库的锁机制 中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎)、表级锁(MYISAM引擎)和页级锁(BDB引擎)。 行级锁 行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。行级锁分为 共享锁 和 排他锁 。 只有通过索引条件检索数据,InnoDB才使用行级锁(MySQL的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但是如果是使用相同的索引键,是会出现锁冲突的。 ),否则,InnoDB将使用表锁! 即便在条件中使用了索引字段,但是否使用索引来检索数据是由MySQL通过判断不同执行计划的代价来决定的,如果MySQL认为全表扫描效率更高,比如对一些很小的表,它就不会使用索引,这种情况下InnoDB将使用表锁,而不是行锁。因此,在分析锁冲突时,别忘了检查SQL的执行计划,以确认是否真正使用了索引。 在MySQL中,行级锁并不是直接锁记录,而是锁索引。索引分为主键索引和非主键索引两种,如果一条sql语句操作了主键索引,MySQL就会锁定这条主键索引

oracle死锁问题查询及处理

て烟熏妆下的殇ゞ 提交于 2019-12-09 16:58:22
一、数据库死锁的现象 程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错。 二、死锁的原理 当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提 交,另一条对于这一列数据做更新操作的语句在执行的时候就会处于等待状态, 此时的现象是这条语句一直在执行,但一直没有执行成功,也没有报错。 三、死锁的定位方法 通过检查数据库表,能够检查出是哪一条语句被死锁,产生死锁的机器是哪一台。 1)用dba用户执行以下语句 select username,lockwait,status,machine,program from v$session where sid in (select session_id from v$locked_object) 如果有输出的结果,则说明有死锁,且能看到死锁的机器是哪一台。字段说明: Username:死锁语句所用的数据库用户; Lockwait:死锁的状态,如果有内容表示被死锁。 Status: 状态,active表示被死锁 Machine: 死锁语句所在的机器。 Program: 产生死锁的语句主要来自哪个应用程序。 2)用dba用户执行以下语句,可以查看到被死锁的语句。 select sql_text from v$sql where hash_value in (select sql_hash_value from v

一个JDBC驱动注册死锁问题总结

僤鯓⒐⒋嵵緔 提交于 2019-12-07 04:18:28
群里有个大神(你假笨)再讲解工作中碰到的一个死锁问题. 这个是大神后来总结的文章: http://lovestblog.cn/blog/2014/07/08/jdk-sql-deadlock/ 情况是这样的: 项目碰到多线程初始化JDBC驱动时,产生死锁,如下实例所示: (我的环境: JDK1.7.0_45, msql_jdbc:mysql-connector-java-5.1.29) public class Temp { public static void main(String[] args) throws Exception { Thread a = new Thread(new ThreadA()); Thread b= new Thread(new ThreadB()); a.start(); b.start(); } } class ThreadA implements Runnable{ @Override public void run() { try { Class.forName("com.mysql.jdbc.Driver", true, Thread.currentThread().getContextClassLoader()); } catch (ClassNotFoundException e) { e.printStackTrace(); } }