前面我们说到了,线程既然存在锁的竞争,那么是否存在锁不释放的问题(即持有锁的某一线程一直占有锁,不释放(或者它在等待其他线程释放锁)),答案是肯定的。那么我们如果解决这个问题呢??
在了解这个问题之前,我们需要明白什么是死锁,什么情况下会问导致死锁?
死锁:处于相互竞争同一资源的线程之间的相互等待,都在等待其他释放,即导致永久阻塞的现象。
活锁:显而易见,就是相互竞争资源的线程,没有阻塞,正常按照一定的顺序执行中。
导致死锁的条件
1、循环等待, 即:线程A 等待线程B占有资源释放,而线程B又在等待线程A占有资源释放,这样就出现了循环等待,都在等待对方释放资源。
2、占有且等待,即:线程A 已经占有X资源,而且这个时候又等待Y资源,这个时候线程A并不释放X资源
3、不允许抢占 ,即:线程A 占有了公共资源X,在线程A没有释放的时候,是不允许其他线程来抢占的
那么我们如何来解决这个死锁的问题呢?(思路:显坏这几个产生死锁的条件)
1、循环等待 --> 可以定义一个执行顺序,根据这个顺序执行来获取指定的资源,这样就可以避免彼此之间都没释放导致循环
2、占有且等待 --> 可以根据所需要申请对应的资源,不需要再等到执行时再去获取对应其他的资源。
3、不允许抢占 --> 主动释放占有的资源,在其去申请其他资源是,申请不到,那么主动释放目前占有的资源
Java内存模型是什么? JMM
JMM是一个抽象的内存模型。
它定义了共享内存中多线程程序读写操作的行为规范:在虚拟机中把共享变量存储到内存以及从内
存中取出共享变量的底层实现细节。通过这些规则来规范对内存的读写操作从而保证指令的正确
性,它解决了CPU多级缓存、处理器优化、指令重排序导致的内存访问问题,保证了并发场景下的
可见性。
什么是线程安全??
原子性、有序性、可见性(硬件层面(CPU高速缓存、指令重排序、JMM))