JUC-八锁现象

5 篇文章 0 订阅

概念

由锁引发的8个问题

  1. 同一对象,两个同步方法,哪个先行?
  2. 同一对象,两个同步方法,先被调用的执行前锁住2s,哪个先行?

  1. 一个对象,一个同步,一个普通方法,哪个先行?
  2. 两个对象,分别调用两个同步方法,先被调用的执行前锁住2s,哪个先行?

  1. 增加两个静态同步方法,哪个先行?
  2. 两个对象,分别调用两个静态同步方法,哪个先行?

  1. 一个对象,一个普通同步方法,一个静态同步方法,哪个先行?
  2. 两个对象,一个普通同步方法,一个静态同步方法,哪个先行?

代码

调用区

Phone phone = new Phone();

new Thread(()->{
    phone.sendSms();
}).start();

//保证call在send之后
try{
    TimeUnit.SECONDS.sleep(1);
}catch(Exception e){
    e.printStackTrace();
}

new Thread(()->{
    phone.call();
}).start();

答案

  1. 1、2
class Phone{
    //synchronized锁的是方法调用者
    //同个对象两个方法的锁是同一把,谁先拿到谁执行
    public synchronized void sendSms(){
        try{
            Thread.sleep(1000);
        }catch(Exception e){
            e.printStackTrace();
        }
        System.out.println("sendSms");
    }

    public synchronized void call(){
        try{
            Thread.sleep(1000);
        }catch(Exception e){
            e.printStackTrace();
        }
        System.out.println("call");
    }
}
  1. 3、4
class Phone2{
    public synchronized void sendSms(){
        try{
            Thread.sleep(1000);
        }catch(Exception e){
            e.printStackTrace();
        }
        System.out.println("sendSms");
    }

    public synchronized void call(){
        try{
            Thread.sleep(1000);
        }catch(Exception e){
            e.printStackTrace();
        }
        System.out.println("call");
    }

    //这里没有锁
    public void hello(){
        System.out.println("hello");
    }
}

普通方法没有锁
两个对象普通方法用不同的锁

  1. 5、6
//synchronized锁的是方法调用者
// static 静态方法,即锁的是Class
public static synchronized void sendSms(){
    try{
        Thread.sleep(1000);
    }catch(Exception e){
        e.printStackTrace();
    }
    System.out.println("sendSms");
}

public static synchronized void call(){
    try{
        Thread.sleep(1000);
    }catch(Exception e){
        e.printStackTrace();
    }
    System.out.println("call");
}

静态方法锁的是Class,所有静态同步方法共用一把锁

  1. 7、8

//静态同步方法
public static synchronized void sendSms(){
    try{
        Thread.sleep(1000);
    }catch(Exception e){
        e.printStackTrace();
    }
    System.out.println("sendSms");
}

//普通同步方法
public synchronized void call(){
    try{
        Thread.sleep(1000);
    }catch(Exception e){
        e.printStackTrace();
    }
    System.out.println("call");
}

静态跟普通同步方法用的是不同的锁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值