面试被问到死锁,赶紧背这几条!


meituan到店事业群平台技术部,秋招火热进行中!

内推方式一:
点击图片链接,查看内推二维码,扫码投简历  https://www.cnblogs.com/CATHY-MU/p/15102097.html

内推方式二:
登陆meituan招聘官网( https://campus.meituan.com/),选择岗位投递简历,在内推码输入框中填写内推码( OYkaHKQ)

平台技术部校招咨询qq群 821133476,入群第一时间获知校招岗位开放信息,第一时间获知补录岗位开放信息,快人一步!
牛客网咨询联系这位=》    https://www.nowcoder.com/profile/8998235 ,我不负责咨询哦

其他文章:
面试被问到.class文件结构,赶紧背这几条!
https://www.nowcoder.com/discuss/684230?source_id=profile_create_nctrack&channel=-1
面试被问到jdk监控工具,赶紧背这几条!
https://www.nowcoder.com/discuss/685100?source_id=profile_create_nctrack&channel=-1
面试被问到操作系统,赶紧背这几条!
https://www.nowcoder.com/discuss/686243?source_id=profile_create_nctrack&channel=-1
面试被问到垃圾回收,赶紧背这几条!
面试被问到散列表,赶紧背这几条!
面试被问到内存管理,赶紧背这几条!
面试被问到arraylist,赶紧背这几条!
面试被问到hashmap,赶紧背这几条!
面试被问到linkedhashmap,赶紧背这几条!
面试被问到 concurrent hashmap,赶紧背这几条!
面试被问到对象的创建过程,赶紧背 这几条!
面试被问到多线程,赶紧背这几条!

线程 A 持有资源 2,线程 B 持有资源 1,他们同时都想申请对方的资源。

public class Demo{ private static Object resource1 = new Object(); private static Object resource2 = new Object(); public static void main(String[] args){ new Tread(
            ()->{ synchronized (resource1){ //do something try{
                        Thread.sleep(1000);//为了让线程2得到执行 }catch(Exception e){ //do something } synchronized(resource2){ //do something }
                }
            },"线程1" ).start(); new Tread(
            ()->{ synchronized (resource2){ //do something try{
                        Thread.sleep(1000);//为了让线程1得到执行 }catch(Exception e){ //do something } synchronized(resource2){ //do something }
                }
            },"线程2" ).start();
    }
}

死锁四个条件
1.互斥:资源只能由一个线程持有
2.保持:阻塞时,保持持有已有资源
3.不剥夺:没有权利剥夺其他线程持有的资源,只能资源释放
4.循环:若干线程之间形成头尾相接的循环等待

如何预防死锁
1.破坏保持:一次性申请所有资源
2.破坏不剥夺:
3.破坏循环:按序申请资源

//将线程2的代码改成这样,按资源1 资源2的顺序获取,就不会死锁了 new Thread(() -> {
            synchronized (resource1) { System.out.println(Thread.currentThread() + "get resource1"); try { Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } System.out.println(Thread.currentThread() + "waiting get resource2");
                synchronized (resource2) { System.out.println(Thread.currentThread() + "get resource2");
                }
            }
        }, "线程 2").start();

sleep和wait的区别
sleep 不释放锁,自动苏醒
wait 释放锁,需要等别的线程调用notify 或notifyall,或者用wait(时间)

调start时会自动调run,为什么不能直接调run
new一个新线程,线程进入新建状态,调用start方***启动一个线程并使线程进入就绪状态,分配到时间片就可以运行了,start会执行线程的准备工作,然后自动执行run方法的内容。
直接调run方法,只是执行了呀一个普通方法,没有在某个线程中执行他,不是多线程工作。


#美团##内推##校招##秋招#
全部评论

相关推荐

头像
不愿透露姓名的神秘牛友
03-13 14:57
点赞 评论 收藏
转发
1 11 评论
分享
牛客网
牛客企业服务