80道最新java基础部分面试题(五)

  

自己整理的面试题,希望可以帮到大家,需要更多资料的可以私信我哦,大家一起学习进步。

  

48,同步和异步有何异同,在什么情况下分别使用他们?举例说明。
如果数据将在线程间共享,例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。

     <李>   

下面两个方法同步吗?(自己发明)
类测试
{
同步静态孔隙sayHello3 ()
{

  
 <代码>}
  
  同步空白getX(){}  
  

}
50,多线程有几种实现方法?同步有几种实现方法?
多线程有两种实现方法,分别是继承线程类与实现运行的接口
同步的实现方面有两种,分别是同步的,等待与通知
等():使一个线程处于等待状态,并且释放所持有的对象的锁。
睡眠():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
通知():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

  李      

51,启动一个线程是用运行()还是开始()?。
启动一个线程是调用开始()方法,使线程就绪状态,以后可以被调度为运行状态,一个线程必须关联一些具体的执行代码,运行()方法是该线程所关联的执行代码。

  

52岁,当一个线程进入一个对象的一个同步的方法后,其它线程是否可进入此对象的其它方法?
分几种情况:
1。其他方法前是否加了同步关键字,如果没加,则能。
2。如果这个方法内部调用了等,则可以进入其他同步的方法。
3。如果其他个方法都加了同步关键字,并且内部没有调用等,则不能。
4。如果其他方法是静态的,它用的同步锁是当前类的字节码,与非静态的方法不能同步,因为非静态的方法用的是这个。

  

53岁线程的基本概念,线程的基本状态以及状态之间的关系

  

一个程序中可以有多条执行线索同时执行,一个线程就是程序中的一条执行线索,每个线程上都关联有要执行的代码,即可以有多段程序代码同时运行,每个程序至少都有一个线程,即主方法执行的那个线程。如果只是一个cpu,它怎么能够同时执行多段程序呢?这是从宏观上来看的,cpu一会执行一线索,一会执行b线索,切换时间很快,给人的感觉是a, b在同时执行,好比大家在同一个办公室上的网,只有一条链接到外部网线,其实,这条网线一会为一个传数据,一会为b传数据,由于切换时间很短暂,所以,大家感觉都在同时上网。

  

状态:就绪,运行,同步阻塞,等待和睡眠挂起,结束.wait必须在同步内部调用。
调用线程的开始方法后线程进入就绪状态,线程调度系统将就绪状态的线程转为运行状态,遇到同步语句时,由运行状态转为阻塞,当同步获得锁后,由阻塞转为运行,在这种情况可以调用等方法转为挂起状态,当线程关联的代码执行完后,线程变为结束状态。

  

54岁的简述同步和java.util.concurrent.locks。锁的异同?
主要相同点:锁能完成同步所实现的所有功能
主要不同点:锁有比同步更精确的线程语义和更好的性能.synchronized会自动释放锁,而锁一定要求程序员手工释放,并且必须在最后从句中释放.Lock还有更强大的功能,例如,它的tryLock方法可以非阻塞方式去拿锁。
举例说明(对下面的题用锁进行了改写):
包com.huawei.interview;

  

进口java.util.concurrent.locks.Lock;
进口java.util.concurrent.locks.ReentrantLock;

  公共类ThreadTest {

  
 <代码>/* *
  * @param arg游戏
  */私人int j;
  私人锁锁=新的ReentrantLock ();
  公共静态void main (String [] args) {//TODO自动生成方法存根
  ThreadTest tt=new ThreadTest ();
  for (int i=0; i<2,我+ +)
  {
  新线程(tt。新加法器()).start ();
  新线程(tt。新的减法器()).start ();
  }
  }
  
  私人类减法器实现Runnable
  {
  
  @Override
  公共空间run () {//TODO自动生成方法存根
  而(真)
  {/*同步(ThreadTest.this) {
  system . out。println (“j -=" + j -);//这里抛异常了,锁能释放吗?
  }*/lock.lock ();
  试一试
  {
  system . out。println (“j -=" + j -);
  }最后
  {
  lock.unlock ();
  }
  }
  }
  
  }
  
  私人类加法器实现Runnable
  {
  
  @Override
  公共空间run () {//TODO自动生成方法存根
  而(真)
  {/*同步(ThreadTest.this) {
  system . out。println (“j + +=? j + +);
  }*/lock.lock ();
  试一试
  {
  system . out。println (“j + +=? j + +);
  }最后
  {
  lock.unlock ();
  }
  }
  }
  
  }

80道最新java基础部分面试题(五)