验证synchronized加在方法上,锁住的对象类别。

最近看偶然看了别人的面经问到了synchronized的相关问题,想起了以前看过的:synchronized加在方法上,锁住的是类实例,然后还记得有个锁住的是类的.class对象。
但那时候只是看了看,记忆并不深,现在突然看到,便想着自己写一份demo去验证一下,synchronized加载方法上时,究竟锁住了写什么,验证Demo如下:

public class Lock {
    //验证synchronized写在普通方法上的锁所住的是类对象
    public synchronized  void method1(){
        try{
            System.out.println("invoke in method1()");
            Thread.sleep(5000);
        }catch (InterruptedException e){

        }
    }

    public void method2(){
        Object o = new Object();
        System.out.println("invoke in method2()");
        synchronized (this){
            System.out.println("now invoke in method2():synchronized block");
        }
    }

//    method3、4验证加载静态方法上的synchronized锁住的是该类的.class对象
    public synchronized static void method3(){
        try{
            System.out.println("invoke in method3()");
            Thread.sleep(5000);
        }catch (InterruptedException e){

        }
    }
    public static void method4(){
        System.out.println("invoke in method4()");
        synchronized (Lock.class){
            System.out.println("now invoke in method4():synchronized block");
        }
    }
    public static void main(String[] args){
        Lock l = new Lock();
//        注释的两组为同一组实验
//        new Thread(()->l.method1()).start();
//        new Thread(()->l.method2()).start();

//        未注释的两组为同一组实验
        new Thread(()->method3()).start();
        new Thread(()->l.method4()).start();
        
//        验证语法基于JDK8,低于JDK8的版本可写成如下形式
//        new Thread(){
//            @Override
//            public void run() {
             你的代码逻辑,如:
//                l.method1();
//            }
//        }.start();

    }
}

通过结果可以看出,sychronized加在普通方法上时,锁住的是该类的实例对象;synchronized加在静态方法上时,锁住的是该类的.class对象。

回答: 在Java中,synchronized关键字可以用来锁住方法,以实现线程同步。当一个线程进入synchronized锁住方法时,其他线程必须等待该线程执行完毕才能进入该方法。此时,锁对象方法所属的对象实例。例如,引用中的代码片段展示了在synchronized块中使用this作为锁对象。另外,引用展示了在synchronized块中使用实例中的成员变量作为锁对象的例子。还有一种使用synchronized锁住方法的方式是在方法声明中使用synchronized关键字,如引用所示,这种方式相当于锁住的是类对象。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [synchronized锁住对象](https://blog.csdn.net/llxxjjllll/article/details/120444095)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [synchronized的几种加锁方式](https://blog.csdn.net/jarniyy/article/details/107954430)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值