9) 2021-11-22 学习记录,以面试回答口吻记录,拒绝八股 多线程与高并发

1.ReentrantLock与Synchronized的区别
①Synchronized是一个关键字,可修饰静态类,方法,代码块。ReentrantLock是一个类,可以被继承可以有方法,更加灵活。
②相同:二者都可以重入,自己可以再次获得对象的锁,一个线程获得一个对象的锁,锁还没有释放,这个线程还可以再次或者该对象的锁,这就是可重入的,如果不可重入可能会造成死锁,当获得一次锁,计数会加1,当计数减为0的时候,锁才可以被释放
③ReebtrantLock使用方便但得配合锁的动作,底层Unsafe调用park加锁,手动释放锁,而synchronized自动释放,操作的是对象头Mark word 重量级锁 010 轻量级锁 000 偏向锁 101 无锁 001 GC 111
2.产生死锁的条件以及如何避免
①互斥条件;: 在某一个时间,独占资源
②请求与保持条件: 一个进程因请求资源而保持,对已获得的资源保持
③不剥夺条件:进程已获得资源,未使用完之前,不能剥夺
④循环等待条件: 若干线程之间形成一中头尾相接的循环等待资源的关系。
解决:
①尽量使用tryLock(long timeout, TimeUnit unit) 还有ReentrantLock 还有ReentrantReadWriteLock,可以设置超时时间,超时可以退出防止死锁
②concurrent类的锁代替手写锁
③降低锁的使用粒度,不要几个功能共用一把锁
④降低代码块的大小

上一篇:java 各种锁


下一篇:Java并发编程——共享模型之管程(死锁、哲学家就餐问题、ReentrantLock、顺序控制)