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

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

  • Java并发基础知识
  • 生产者和消费者问题
  • Thread和Runnable实现多线程的区别
  • 线程中断
  • 守护线程与阻塞线程
  • synchronized
  • 多线程环境中安全使用集合API
  • 实现内存可见的两种方法比较:加锁和volatile变量
  • 死锁
  • 可重入内置锁
  • 使用wait/notify/notifyAll实现线程间通信
  • NIO
并发这一块挺重要的,面试官经常会问,这一块没有深入去了解,所以可以看看上述链接,挺详细的。

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。此类所有的实例化对象在调用此方法,共用同一把锁,我们称之为类锁。

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


你可能感兴趣的:(面试)