深入解析死锁问题与线程安全:synchronized与Lock的异同及sleep()与wait()的区别

死锁问题

深入解析死锁问题与线程安全:synchronized与Lock的异同及sleep()与wait()的区别

不同线程互相占用对方的同步资源,互不放弃。如果等待对方放弃,就会出现僵局。

死锁形成后,不会出现异常或提示,但所有线程都被阻塞,无法继续。

锁

它是同步代码方法的替代方法,是解决线程安全问题的一种方法。

同步和锁的异同

两者都是用来解决线程安全问题

区别在于:

执行代码后synchronized会自动释放监视器。

lock 手动启动同步并使用unlock() 手动释放同步。

建议先使用lock。

比较面试问题的三种方法

睡眠()和等待()

一旦执行这两个方法,当前线程就可以进入阻塞状态。

(1)但是两种方法使用的位置不同。

Sleep()在Thread类中声明,wait()在对象中声明

(2)调用范围或要求不同

sleep()可以在需要的时候调用

wait() 必须放在同步代码块中

(3) 是否释放同步监视器的问题

sleep() 不会释放

wait() 将

class Number implements Runnable{
    private int num =1;
    @Override
    public void run() {
        while(true){
            synchronized (this) {
                    this.notify();
                    //唤醒线程
                if(num<=100){
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName()+":"+num);
                    num++;
                    try {
                        //使得调用该方法的线程进入阻塞
                        //使用wait 会释放线程锁
                        this.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }else{
                    break;
                }
            }
        }
    }
}
public class ThreadCommunication {
    public static void main(String[] args) {
        Number num1=new Number();
        Thread t1=new Thread(num1);
        Thread t2=new Thread(num1);
        Thread t3=new Thread(num1);
        t1.setName("Thread1");
        t2.setName("Thread2");
        t1.start();
        t2.start();
    }
}

你可能想看:
« 上一篇
下一篇 »

相关推荐

java中什么是冒泡,冒泡算法

2026年09月06日

28阅读

java中冒号,java双冒号

2026年09月06日

27阅读

java中的->,java中的是什么意思

2026年09月06日

27阅读

java中的super用法,Java中super的说明

2026年09月06日

28阅读

java中反射的应用,java中反射的应用场景

2026年09月06日

26阅读

java中开关的定义,Java关键字有哪些

2026年09月06日

28阅读