线程同步下的死锁机制
程序员文章站
2022-03-10 16:03:02
...
死锁
比如说有两个线程T1和T2,在线程同步的情况下,有两个锁L1和L2。当T1线程持有L1锁,想去访问L2锁住的资源。当T2线程持有L2锁,想去访问L1下面的资源。这个时候T1和T2线程就会彼此僵持着,两个线程都不肯让步,等待彼此释放资源(开锁),就这样无限等待中。。。
手写死锁程序
创建两个锁对象
public class Lock {
public static Object lock1=new Object();
public static Object lock2=new Object();
}
创建一个类实现Runnable接口
package Deadlock;
/**
* 死锁
*/
public class Deadlock implements Runnable {
private boolean fig;
public Deadlock(boolean fig) { this.fig = fig; }
@Override
public void run() {
if(fig){
while (true) {
synchronized (Lock.lock2) {//lock2锁
System.out.println(Thread.currentThread().getName() + " " + "lock2锁");
synchronized (Lock.lock1) {//lock1锁
System.out.println(Thread.currentThread().getName() + " " + "lock1锁");
}
}
}
}else {
while (true) {
synchronized (Lock.lock1) {//lock1锁
System.out.println(Thread.currentThread().getName() + " " + "lock1锁");
synchronized (Lock.lock2) {//lock2锁
System.out.println(Thread.currentThread().getName() + " " + "lock2锁");
}
}
}
}
}
}
这个类里面有个boolean类型的fig用于线程的切换,创建对象的时候传入一个boolean值,让一个线程执行分别执行if和else里面的代码,产生一个死锁。
创建一个测试类开启线程
package Deadlock;
public class Text {
public static void main(String[] args) {
Thread thread1=new Thread(new Deadlock(true));
Thread thread2=new Thread(new Deadlock(false));
thread1.start();
thread2.start();
}
}
运行结果:
运行多次后会发现,死锁是肯定会产生的,只是时间问题。第一种情况(左图):有可能是第一个线程抢到CPU的时间片,执行第一个锁(lock1),并上锁。输出一句话,没来得及判断第二个锁(lock2),CPU的执行权就被第二个线程抢到,第二个线程发现第二锁(lock2)没有上锁,输出一句话,并上锁。然后判断第一个锁(lock1),发现锁上了,等待。第一个线程又判断lock2,也发现锁上了,等待。程序就一直等待着!第二种情况是:第一个线程运气比较好,连续多次抢到了CPU的执行权,一但第二个线程抢到CPU执行权就会等待。
总结
在编程过程中,我们不是专门去写死锁,写BUG。而是为了知道死锁怎样产生的,然后避免死锁。
每日鸡汤:越来越发现,越是阳光,正能量的人,才越会好运 。-----------------(比如说我,哈哈)
Over!
上一篇: 用ps将熊猫变成成一只熊
推荐阅读
-
编程技巧 多线程下的随机数初始化
-
Android的线程通信:消息机制原理(Message,Handler,MessageQueue,Looper),异步任务AsyncTask,使用JSON
-
MySQL数据库在主流操作系统下的同步_MySQL
-
Java线程同步机制_动力节点Java学院整理
-
Java 多线程同步 锁机制与synchronized深入解析
-
深入多线程之:用Wait与Pulse模拟一些同步构造的应用详解
-
windows环境下mysql数据库的主从同步备份步骤(单向同步)
-
Java 多线程同步 锁机制与synchronized深入解析
-
C#线程同步的三类情景分析
-
深入多线程之:用Wait与Pulse模拟一些同步构造的应用详解