面试-产生线程死锁的原因和处理方式
背景:线程同步(就是加锁)会有一个问题,就是产生死锁所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
帮助理解:地上放着两个桶泡面,一个老坛酸菜,一个小鸡炖磨茹。有两个人:一个产品(线程1),一个测试(线程2),同时扑向抢老坛酸菜(锁A)和小鸡炖磨茹(锁B),产品拿到老坛酸菜,测试拿到小鸡炖磨茹,同一时刻,产品伸要去拽测试怀里的小鸡炖磨茹,测试伸手去拽产品的老坛酸菜,互使剪刀脚两个僵持不下,就卡死在那了,叫这就死锁。如果没有一个开发将他们各打一顿解救出来(中断状态),它们将无法推进下去。
发生死锁的具体原因如下:
因为系统资源不足。
进程运行推进的顺序不合适。
资源分配不当。
举列说明场景:死锁是因为多线程访问共享资源,由于访问的顺序不当所造成的,通常是一个线程锁定了一个资源A,而又想去锁定资源B;在另一个线程中,锁定了资源B,而又想去锁定资源A以完成自身的操作,两个线程都想得到对方的资源,而不愿释放自己的资源,造成两个线程都在等待,而无法执行的情况。
死锁预防如果只使用一个锁就不会有死锁的问题,不 ...
什么是线程安全?举例说明,区别。
线程安全:当多个线程访问某个方法时,不管你通过怎样的调用方式或者说这些线程如何交替的执行,我们在主程序中不需要去做任何的同步,这个类的结果行为都是我们设想的正确行为,那么我们就可以说这个类时线程安全的。
线程不安全:在多核CPU的环境下,当多个线程访问同一个共享变量时,这个变量没有使用任务同步机制,会出现CPU 缓存同步内存不及时,导致出现数据不同步的情况,这就是所谓的线程不安全。单核CPU没有这个问题。
hashcode用在哪
hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的;如果两个对象相同,就是适用于equals方法进行比较,那么这两个对象的hashCode一定要相同;
hashcode 相等两个类一定相等吗? equals呢? 相反呢?
结论:不一定相等。
原因:hashCode 算法有一定概率产生相同的 hashCode,即 hash 碰撞。
分重写 和 未重写 hashcode、equals 方法两种场景:
一、hashcode 方法 和 equals 方法没有重写时
hashcode相等两个类不一定相等
equals返回true的两个类一定相等(为同一个对象)
两个类相等hashcode不一定相等
两个类相等equals不一定返回true
二、hashcode 方法和 equals 方法均已按规范重写时
hashcode相等,两个类不一定相等(存在哈希冲突)
equals返回true的两个类一定相等
两个类相等hashcode一定相等
两个类相等equals一定返回true