sychronized面试问题浅析

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

1、sychronized相关 java

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

一、sychronized均可以同步什么?
    sychronized基本用法就是修饰方法和代码块,可是面试官说类、对象、方法、代码块均可以。这一点让我很迷惑,由于我历来没见过sychronized能够修饰类和对象的。再回去的路上我忽然注意到,他问的是同步,而不是修饰,这样一想,他的问题就一下在明了了,看以下代码就明白了:
多线程

//1、修饰方法
public synchronized void test1() {
     XXX...;
}

//2、修饰代码块
//一、同步类
synchronized(Object.getClass()){
}

//二、同步对象
synchronized(Object){
}

//三、常规的同步代码块,可是其实当所处方法为普通方法时,this就是当前对象;为静态方法时,this是当前类
synchronized(this){
}
二、 sychronized同步代码块和同步 对象有什么不一样?
    其实这个应该是问上边代码中二.2和二.3有什么不一样(当所处方法为静态的时,为 二.1和二.3 ),其实对于 sychronized而言,二者处理是同样的,不一样之处在于一个是当前对象,一个是其余对象。
    首先,咱们来分析下sychronized(Object)到底有什么做用。
sychronized(Object)在执行时会尝试获取Object的对象锁,而这回产生两个做用:一、一个对象内的同步代码(方法)只有获取对象锁的线程才能执行,不然就会被阻塞。二、只有获取对象锁的线程能够进入sychronized(Object{}中的代码块{}。这样来看。二者的区别就很明显了(假设当前对象为A,同步Object为B):
  • 当B为this(A=B=this)时,只有获取A锁的线程能够执行sychronized代码块,同时其余线程在调用A内其余同步块时一样会被阻塞。
  • 当B为其余对象时,只有获取B锁的线程能够执行sychronized代码块,同时其余线程能够调用A内其余同步块(同步锁不为B的锁),而且其余全部须要获取B锁的同步块将会被阻塞。
    总感受仍是没说明白,若是不清楚能够自行查资料,这一块用着看似简单,可是其实道道挺多的。此外感受这两个问题仍是颇有水平的,可以很容易区分你是否真的对多线程有不少经验,通常状况下咱们简单的使用很难注意到这些细节。
相关文章
相关标签/搜索