浅谈线程死锁

简介: 浅谈线程死锁

死锁是指两个或两个以上的线程在执行过程中,由于竞争同步锁而产生的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的线程称为死锁。
锁案例:

public class LockR1 {

public static LockR1 r1 = new LockR1();

}

public class LockR2 {

public static LockR2 r2 = new LockR2();

}
public class DeadLock implements Runnable {

private boolean flag;
public DeadLock(boolean flag){
    this.flag = flag;
}
public void run() {
    while (true){
        if(flag){
            synchronized (LockR1.r1){
                System.out.println("if...获取r1锁");
                synchronized (LockR2.r2)
                    System.out.println("if...获取r2锁");
                }
            }
        }else{
           
            synchronized (LockR2.r2){
                System.out.println("else...获取r2锁");
              synchronized (LockR1.r1){
                    System.out.println("else...获取r1锁");
                }
            }
        }
    }
}

}

public class DeadLockTest {

public static void main(String[] args) {
    DeadLock d1 = new DeadLock(true);
    DeadLock d2 = new DeadLock(false);

    Thread t1 = new Thread(d1);
    Thread t2 = new Thread(d2);

    t1.start();
    t2.start();
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
线程同步-概念,synchronized,锁对象的选择,锁池状态:
同步代码块:线程操作的共享数据进行同步。synchronized关键字可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。
同步方法:当一个方法中的所有代码,全部是线程操作的共享数据的时候,可以将整个方法进行同步。使用synchronized修饰的方法,就叫做同步方法,保证A线程执行该方法的时候,其他线程只能在方法外等着。
购票系统:

public class Ticket implements Runnable {

private int ticket = 100;

@Override
public void run() {
    //每个窗口卖票的操作 
    //窗口 永远开启 
    while (true) {
        if (ticket > 0) {//有票 可以卖
            //出票操作
            //使用sleep模拟一下出票时间 
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            //获取当前线程对象的名字 
            String name = Thread.currentThread().getName();
            System.out.println(name + "正在卖:" + ticket--);
        }
    }
}

}
测试
public static void main(String[] args) {

//创建线程任务对象
Ticket ticket = new Ticket();
//创建三个窗口对象
Thread t1 = new Thread(ticket, "窗口1");
Thread t2 = new Thread(ticket, "窗口2");
Thread t3 = new Thread(ticket, "窗口3");

//同时卖票
t1.start();
t2.start();
t3.start();

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
同步代码块

public class Ticket implements Runnable{

private int ticket = 100;
private Object lock = new Object();
/*
 * 执行卖票操作
 */
@Override
public void run() {
    //每个窗口卖票的操作 
    //窗口 永远开启 
    while(true){
        synchronized (lock) {
            if(ticket>0){//有票 可以卖
                //出票操作
                //使用sleep模拟一下出票时间 
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                //获取当前线程对象的名字 
                String name = Thread.currentThread().getName();
                System.out.println(name+"正在卖:"+ticket--);
            }
        }
    }
}

}
同步方法

public class Ticket implements Runnable{
private int ticket = 100;
/*
 * 执行卖票操作
 */
@Override
public void run() {
    //每个窗口卖票的操作 
    //窗口 永远开启 
    while(true){
        sellTicket();
    }
} 
/*
 * 锁对象 是 谁调用这个方法 就是谁 
 *   隐含 锁对象 就是  this
 *    
 */
public synchronized void sellTicket(){
    if(ticket>0){//有票 可以卖    
        //出票操作
        //使用sleep模拟一下出票时间 
        try {
              Thread.sleep(100);
        } catch (InterruptedException e) {
              e.printStackTrace();
        }
        //获取当前线程对象的名字 
        String name = Thread.currentThread().getName();
        System.out.println(name+"正在卖:"+ticket--);
    }
}

}

谢谢!

相关文章
|
1月前
|
监控 Linux 编译器
多线程死锁检测的分析与实现(linux c)-有向图的应用
在日常的软件开发中,多线程是不可避免的,使用多线程中的一大问题就是线程对锁的不合理使用造成的死锁,死锁一旦发生,将导致多线程程序响应时间长,吞吐量下降甚至宕机崩溃,那么如何检测出一个多线程程序中是否存在死锁呢?在提出解决方案之前,先对死锁产生的原因以及产生的现象做一个分析。最后在用有向环来检测多线程中是否存在死锁的问题。
66 0
|
1月前
|
存储 安全 Java
并发编程知识点(volatile、JMM、锁、CAS、阻塞队列、线程池、死锁)
并发编程知识点(volatile、JMM、锁、CAS、阻塞队列、线程池、死锁)
79 3
|
2天前
|
Arthas 监控 Java
深入解析与解决高并发下的线程池死锁问题
在高并发的互联网应用中,遇到线程池死锁问题导致响应延迟和超时。问题源于库存服务的悲观锁策略和线程池配置不当。通过以下方式解决:1) 采用乐观锁(如Spring Data JPA的@Version注解)替换悲观锁,减少线程等待;2) 动态调整线程池参数,如核心线程数、最大线程数和拒绝策略,以适应业务负载变化;3) 实施超时和重试机制,减少资源占用。这些改进提高了系统稳定性和用户体验。
24 2
|
2天前
|
Java
在Java中,死锁是指两个或多个线程互相等待对方释放资源,从而导致所有线程都无法继续执行的情况。
【6月更文挑战第24天】在Java并发中,死锁是多线程互相等待资源导致的僵局。避免死锁的关键策略包括:防止锁嵌套,设定固定的加锁顺序,使用`tryLock`带超时,避免无限等待,减少锁的持有时间,利用高级同步工具如`java.util.concurrent`,以及实施死锁检测和恢复机制。通过这些方法,可以提升程序的并发安全性。
9 1
|
6天前
|
Java
死锁是线程间争夺资源造成的无限等待现象,Java示例展示了两个线程各自持有资源并等待对方释放,导致死锁。`
【6月更文挑战第20天】死锁是线程间争夺资源造成的无限等待现象,Java示例展示了两个线程各自持有资源并等待对方释放,导致死锁。`volatile`保证变量的可见性和部分原子性,确保多线程环境中值的即时更新。与`synchronized`相比,`volatile`作用于单个变量,不保证原子操作,同步范围有限,但开销较小。`synchronized`提供更全面的内存语义,保证原子性和可见性,适用于复杂并发控制。
14 3
|
20天前
|
Python
Python多线程中递归锁如何解决死锁问题的详细阐述
Python多线程中递归锁如何解决死锁问题的详细阐述
|
20天前
|
安全 Python
Python多线程中的死锁与递归锁
Python多线程中的死锁与递归锁
|
1天前
|
Java
java线程之死锁
java线程之死锁
6 0
|
2天前
|
Java
synchronized关键字在Java中为多线程编程提供了一种简便的方式来管理并发,防止数据竞争和死锁等问题
Java的`synchronized`关键字确保多线程环境中的数据一致性,通过锁定代码段或方法防止并发冲突。它可修饰方法(整个方法为临界区)或代码块(指定对象锁)。例如,同步方法只允许一个线程执行,同步代码块则更灵活,可锁定特定对象。使用时需谨慎,以避免性能影响和死锁。
9 0
|
5天前
|
安全 算法 调度
多线程之死锁
多线程之死锁
11 0