1.常见的锁包括:互斥锁,自旋锁。
2.互斥锁是指锁的类型,自旋锁是指锁的实现方式。
3.互斥锁:当上一个线程的任务没有执行完时(被锁住),那么下一个线程会进入休眠状态,等待任务执行完毕,只有上一个任务执行完,下一个线程才会唤醒执行任务。
4.自旋锁:当上一个线程的任务没执行完时(被锁住),下一个线程始终等待,循环访问是否执行完成。效率高,但是耗CPU,并且可能死锁。
典型的问题 OSSpinLock:不同优先级线程调度会有优先级反转问题。当资源被低优先级线程锁住,高优先级线程无法访问,但低优先级任务无法与高优先级竞争,导致低优先级任务无法完成,锁不能释放,造成死锁。
5.自旋锁是一种特殊的互斥锁,当资源被加锁后,其他线程想要再次加锁,此时该线程不会被阻塞睡眠,而是进入循环等待状态(不能做其他事情)。循环检查资源持有者是否释放了资源,这样做的好处是减少了唤醒线程造成的资源消耗,但一直占用CPU。适用于资源占用时间段,又不希望消耗资源唤醒线程的场景。
6.atomic的分析:
atomic的本质是在setter和getter方法内部使用@sychronized加锁来确保原子操作。@sychronized不能保证线程安全,性能最低,因为内部做了exception handle。(异常处理)。
不能保证线程安全,比如线程A访问getter方法,B和C访问setter方法。A线程得到的结果可能有三种:未修改的,B改过的,C改过的。