线程死锁问题

多把锁

  • 为了提高并发度我们可以提供多把锁,假设有一个共享资源room对象,很多线程会去访问,一部分线程只访问其中a资源,另一部分线程只访问b的资源,此时如果所有线程把锁加在room对象上面虽然可以保证线程安全,但是并发度不高。
class Room{
   
    Object a= new Object();
    Object b= new Object();
}
  • 此时可以使用两把锁,不要把锁加在room对象,而是分别加在a和b对象,这样第一类线程只需要申请a的锁,第二类线程只需要申请b的锁,锁的粒度变小了,两类线程之间就没有竞争关系了从而提高了并发度。

死锁问题

  • 引入多把锁会容易产生死锁问题,如上例子,现实中会有很多线程既需要访问资源a也需要访问资源b。
  • 如果线程1获取了对象a的锁,正在等待获取对象b的锁,同时线程c获取了对象b的锁,正等待获取对象a的锁,此时两个线程就会陷入死等状态。如下代码所示
public class Test {
   
    static Object a = new Object();
    static Object b = new Object();
    public static Logger log = LoggerFactory.getLogger(Test.class);
    public static void main(String[] args) throws InterruptedException {
   

        new Thread(()->{
   
            synchronized (a){
   
                log.info("线程t1已经获取a的锁");
                sleep(1000);
                log.info("线程t1等待获取b的锁");
                synchronized (b){
   
                }
            }
        },"t1").start();

        new Thread(()->{
   
            synchronized (b){
   
                log.info("线程t2已经获取b的锁");
                sleep(1000);
                log.info("线程t2等待获取a的锁");
                synchronized (a){<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值