zoukankan      html  css  js  c++  java
  • sychronized面试问题浅析

        先说下面试吧,整体来说基础准备好点,简历别太假,然后回答起来实事求是,表现自然的点基本上都没问题吧(针对初级职位,记得有个hr说过对于新人基础扎实和为人真诚是最关键的),两天时间跑起来挺累,反而觉得面试时挺轻松的。 

    一、sychronized相关

        这个很常见,面试基本上都会问到多线程这一块,而多线程重点则是同步这一块,所以sychronized基本上必问。对于sychronized的一般用法,大家都知道,无非就是修饰方法和修饰代码块的区别,以及类、对象、静态方法同步时的一些常见问题,这里不再赘述,如不清楚可参考下边链接。但是对于如下的问题,你是否能搞清楚呢?

    1、sychronized都可以同步什么?
        sychronized基本用法就是修饰方法和代码块,但是面试官说类、对象、方法、代码块都可以。这一点让我很迷惑,因为我从来没见过sychronized可以修饰类和对象的。再回去的路上我突然注意到,他问的是同步,而不是修饰,这样一想,他的问题就一下在明了了,看如下代码就明白了:

    //一、修饰方法
    public synchronized void test1() {
         XXX...;
    }
    
    //二、修饰代码块
    //1、同步类
    synchronized(Object.getClass()){
    }
    
    //2、同步对象
    synchronized(Object){
    }
    
    //3、常规的同步代码块,但是其实当所处方法为普通方法时,this就是当前对象;为静态方法时,this是当前类
    synchronizedthis){
    }

    2、 sychronized同步代码块和同步对象有什么不同?
        其实这个应该是问上边代码中二.2和二.3有什么不同(当所处方法为静态的时,为 二.1和二.3),其实对于 sychronized而言,两者处理是一样的,不同之处在于一个是当前对象,一个是其他对象。
        首先,我们来分析下sychronized(Object)到底有什么作用。
    sychronized(Object)在执行时会尝试获取Object的对象锁,而这回产生两个作用:1、一个对象内的同步代码(方法)只有获取对象锁的线程才能执行,否则就会被阻塞。2、只有获取对象锁的线程可以进入sychronized(Object{}中的代码块{}。这样来看。两者的区别就很明显了(假设当前对象为A,同步Object为B):

    • 当B为this(A=B=this)时,只有获取A锁的线程可以执行sychronized代码块,同时其他线程在调用A内其他同步块时同样会被阻塞。
    • 当B为其他对象时,只有获取B锁的线程可以执行sychronized代码块,同时其他线程可以调用A内其他同步块(同步锁不为B的锁),并且其他所有需要获取B锁的同步块将会被阻塞。

        总感觉还是没说明白,如果不清楚可以自行查资料,这一块用着看似简单,但是其实道道挺多的。此外感觉这两个问题还是很有水平的,能够很容易区分你是否真的对多线程有很多经验,一般情况下我们简单的使用很难注意到这些细节。

  • 相关阅读:
    转:PHP环境搭建
    证件号码
    3、SourceTree通过PUTTY连接GitLab
    2、gitlab 新建项目
    java基础31 List集合下的Vector集合
    java基础30 List集合下的LinkedList集合
    java基础29 迭代器 listIterator() 及各种遍历集合的方法
    java基础28 单例集合Collection下的List和Set集合
    java基础27 单例集合Collection及其常用方法
    错误/异常:The project cannot be built until build path errors are resolved 和 Unbound classpath container: 'JRE System Library [JavaSE-1.7]' in project 'MyJavaCode';的解决方法
  • 原文地址:https://www.cnblogs.com/good-temper/p/3617443.html
Copyright © 2011-2022 走看看