android面试-JavaConcurrent(Java并发)(深信服、美图)

JavaConcurrent(Java并发)(都是github上的内容)

并发这一块挺重要的,面试官经常会问,这一块没有深入去了解,所以可以看看上述链接,挺详细的。

1、java有哪几种线程开启方式


Java中实现多线程有两种方法:继承Thread、实现Runnable接口,在程序开发中只要是多线程,肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下优势:

  1. 可以避免由于Java的单继承特性而带来的局限
  2. 增强程序的健壮性,代码能够被多个线程共享,代码与数据是独立的
  3. 适合多个相同程序的线程区处理同一资源的情况

2、如何保证线程顺序执行,即A执行完之后才执行B、B执行完之后才执行C


面试的时候因为本身就对于并发使用不多,然后面试官问的时候,一开始的思路是通过join去实现,但是回到宿舍马上查了一下发现好像不行,最后找到一种办法是通过线程池,有四种类型线程池,其中一种是每次只执行一个线程,从而保证线程能正确执行。

3、volitatile变量作用(主要还是出现在笔试中)

接触过就是在双重锁单例中,保证可见性、有序性等,但无法保证原子性,原子性意思即要不就0要不就1,如果失败会回退到0。

4、对象锁、方法锁、类锁区别(美图)

对象锁跟方法锁锁的是有对象的,类锁只是一个概念上的东西,并不是真实存在的,它只是用来帮助我们理解锁定实例方法和静态方法的区别的

当程序运行到非静态的synchronized同步方法上时,自动获得与正在执行代码类的当前实例(this实例)有关的锁。获得一个对象的锁也称为获取锁、锁定对象、在对象上锁定或在对象上同步。
     
由于一个class不论被实例化多少次,其中的静态方法和静态变量在内存中都只有一份。所以,一旦一个静态的方法被申明为synchronized。此类所有的实例化对象在调用此方法,共用同一把锁,我们称之为类锁。

概念上的我们理解清楚了,那么这两个使用的时候有什么差别,但我们使用的时候,对象锁跟类锁是不互斥的,因为他们都不是同个对象的东西,对象锁是对于对象的锁,即锁上之后同一对象在不同的线程中无法同时访问锁的资源,而类锁的话针对的是静态实例之类的,是一个共享的资源,被锁上之后不同对象无法获取资源


猜你喜欢

转载自blog.csdn.net/wzhworld/article/details/78326454