千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

首页 视频教程 培训课程 师资团队 技术干货 常见问题 面试题 职场就业 零基础学Java 行业资讯
【热点话题】 Java技术干货 Java学习教程 Java学习笔记 Java面试题 Java培训问答 Java培训机构哪些好 Java职场就业
当前位置:Java培训  >  java技术干货  >  千锋Java培训分享:Java实习生面试题

千锋Java培训分享:Java实习生面试题

来源:千锋教育
发布人:千锋Java
时间: 2018-10-11 15:31:00 1539243060

  经历了十一长假,一切工作也该逐渐恢复正轨,继续在自己的岗位上做着自己应该做的事情,继续在知乎上分享java实习生面试题,预祝每一位准备在金九银十找工作的小伙伴都能找到自己满意的工作!本文由千锋Java培训就业学员分享。

  本次的面试题:多线程知识的面试解答题。

图片1

  1. 有T1、T2、T3三个线程,如何怎样保证T2在T1执行完后执行,T3在T2执行完后执行?

  答:使用join方法。

  join方法的功能是使异步执行的线程变成同步执行。即调用线程实例的start方法后,该方法会立即返回,如果调用start方法后,需要使用一个由这个线程计算得到的值,就必须使用join方法。如果不使用join方法,就不能保证当执行到start方法后面的某条语句时,这个线程一定会执行完。而使用join方法后,直到这个线程退出,程序才会往下执行。

  2.Java中的Lock接口,比起synchronized,优势在哪里?

  如果需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此来保持它的完整性,如何实现?

  Lock接口最大的优势是为读和写分别提供了锁。

  读写锁ReadWriteLock拥有更加强大的功能,它可细分为读锁和解锁。

  读锁可以允许多个进行读操作的线程同时进入,但不允许写进程进入;写锁只允许一个写进程进入,在这期间任何进程都不能再进入。(完全符合题目中允许多个用户读和一个用户写的条件)

  要注意的是每个读写锁都有挂锁和解锁,最好将每一对挂锁和解锁操作都用try、finally来套入中间的代码,这样就会防止因异常的发生而造成死锁得情况。

  下面是一个示例程序:

  ```

  import java.util.Random;

  import java.util.concurrent.locks.*;

  public class ReadWriteLockTest {

  public static void main(String[] args) {

  final TheData myData=new TheData(); //这是各线程的共享数据

  for(int i=0;i<3;i++){ //开启3个读线程

  new Thread(new Runnable(){

  @Override

  public void run() {

  while(true){

  myData.get();

  }

  }

  }).start();

  }

  for(int i=0;i<3;i++){ //开启3个写线程

  new Thread(new Runnable(){

  @Override

  public void run() {

  while(true){

  myData.put(new Random().nextInt(10000));

  }

  }

  }).start();

  }

  }

  }

  class TheData{

  private Object data=null;

  private ReadWriteLock rwl=new ReentrantReadWriteLock();

  public void get(){

  rwl.readLock().lock(); //读锁开启,读线程均可进入

  try { //用try finally来防止因异常而造成的死锁

  System.out.println(Thread.currentThread().getName()+"is ready to read");

  Thread.sleep(new Random().nextInt(100));

  System.out.println(Thread.currentThread().getName()+"have read date"+data);

  } catch (InterruptedException e) {

  e.printStackTrace();

  } finally{

  rwl.readLock().unlock(); //读锁解锁

  }

  }

  public void put(Object data){

  rwl.writeLock().lock(); //写锁开启,这时只有一个写线程进入

  try {

  System.out.println(Thread.currentThread().getName()+"is ready to write");

  Thread.sleep(new Random().nextInt(100));

  this.data=data;

  System.out.println(Thread.currentThread().getName()+"have write date"+data);

  } catch (InterruptedException e) {

  e.printStackTrace();

  } finally{

  rwl.writeLock().unlock(); //写锁解锁

  }

  }

  }

  ```

  3. java中wait和sleep方法有何不同?

  很大的不同是在等待时wait会释放锁,而sleep一直持有锁。Wait通常被用于线程间交互,sleep通常被用于暂停执行。

  其它不同有:

  - sleep是Thread类的静态方法,wait是Object方法。

  - wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用

  - sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。

  千锋Java培训依据企业需求制定课程大纲,以就业为导向,拥有严格科学的管理制度,业内知名师资队伍和一体化就业保障体系,更推出“两周免费试听,不满意不缴费”政策让学员可以体验真实教学效果。

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。

猜你喜欢LIKE

最新文章NEW

相关推荐HOT

更多>>
开班信息
北京校区
  • 北京校区
  • 大连校区
  • 广州校区
  • 成都校区
  • 杭州校区
  • 长沙校区
  • 合肥校区
  • 南京校区
  • 上海校区
  • 深圳校区
  • 武汉校区
  • 郑州校区
  • 西安校区
  • 青岛校区
  • 重庆校区
  • 太原校区
  • 沈阳校区
  • 南昌校区
  • 哈尔滨校区

14天品质课程免费学

10年以上业内强师带你蜕变精英

提交领取