Java面试大全(2020年版)151-160

151.sleep( ) 和 wait( n)、wait( ) 的区别:

  • sleep 方法:是 Thread 类的静态方法,当前线程将睡眠 n 毫秒,线程进入阻塞状态。当睡眠时间到了,会解除阻塞,进行可运行状态,等待 CPU 的到来。睡眠不释放锁(如果有的话);
  • wait 方法:是 Object 的方法,必须与 synchronized 关键字一起使用,线程进入阻塞状态,当 notify 或者notifyall 被调用后,会解除阻塞。但是,只有重新占用互斥锁之后才会进入可运行状态。睡眠时,释放互斥锁;

152.synchronized 关键字:

  • 底层实现:
    • 进入时,执行 monitorenter,将计数器 +1,释放锁 monitorexit 时,计数器-1;
    • 当一个线程判断到计数器为 0 时,则当前锁空闲,可以占用;反之,当前线程进入等待状态。
  • 含义:(monitor 机制)
    • Synchronized 是在加锁,加对象锁。对象锁是一种重量锁(monitor),synchronized 的锁机制会根据线程竞争情况在运行时会有偏向锁(单一线程)、轻量锁(多个线程访问 synchronized 区域)、对象锁(重量锁,多个线程存在竞争的情况)、自旋锁等。

153.什么是进程

进程是指运行中的应用程序,每个进程都有自己独立的地址空间(内存空间)。
比如用户点击桌面的IE浏览器,就启动了一个进程,操作系统就会为该进程分配独立的地址空间。当用户再次点击左边的IE浏览器,又启动了一个进程,操作系统将为新的进程分配新的独立的地址空间。目前操作系统都支持多进程。

154.什么是线程

进程是表示自愿分配的基本单位。而线程则是进程中执行运算的最小单位,即执行处理机调度的基本单位。通俗来讲:一个程序有一个进程,而一个进程可以有多个线程。

155.多线程的几种实现方式

  • 继承Thread类创建线程
    Thread类本质上是实现了Runnable接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法将启动一个新线程,并执行run()方法。这种方式实现多线程比较简单,通过自己的类直接继承Thread,并重写run()方法,就可以启动新线程并执行自己定义的run()方法。
  • 实现Runnable接口创建线程
    如果自己的类已经继承了两一个类,就无法再继承Thread,因此可以实现一个Runnable接口
  • 实现Callable接口通过FutureTask包装器来创建Thread线程
  • 使用ExecutorService、Callable、Future实现有返回结果的线程
    ExecutorService、Callable、Future三个接口实际上都是属于Executor框架。返回结果的线程是在JDK1.5中引入的新特征,有了这种特征就不需要再为了得到返回值而大费周折了。
    可返回值的任务必须实现Callable接口;无返回值的任务必须实现Runnabel接口。
    执行Callable任务后,可以获取一个Future对象,在该对象上调用get()方法就可以获取到Callable任务返回的Object了。(get()方法是阻塞的,线程无返回结果,该方法就一直等待)

156.Vector、SimpleDateFormat是线程安全类吗

Vector类的单个方法是原子性的,符合操作不是原子性的
SimpleDateFormat类不是线程安全的

157.哪些集合类是线程安全的

  • Vector
  • Stack
  • hashtable
  • enumeration
  • StringBuffer

158.多线程中忙循环是什么

忙循环就是程序员用循环让一个线程等待,不像传统方法wait()、sleep()或者yied()它们都放弃了CPU控制,而忙循环不会放弃CPU,它就是在运行一个空循环。这么做的目的是为了保留CPU缓存,在多核系统中,一个等待线程醒来的时候可能会在另一个内核运行,这样会重建缓存。为了避免重建缓存和减少等待重建的时间就可以使用它了。

159.什么是线程局部变量

ThreadLocal并非是一个线程本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量)。也许把它命名为ThreadLocalVar更合适。线程局部变量(ThreadLocal)功能非常简单,就是为每一个使用该变量的线程都提供了一个变量值副本,是java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其他线程的副本冲突。

160.什么是多线程环境下的伪共存(false sharing)

缓存系统中是以缓存行为单位存储的。缓存行是2的整数幂个连续字节,一般为32-256个字节。最常见的缓存行大小是64个字节。当多线程修改互相独立的变量时,如果这些变量共享同一个缓存航,就会无意中影响彼此的性能,这就是伪共存

原创文章 57 获赞 4 访问量 2683

猜你喜欢

转载自blog.csdn.net/m0_47572402/article/details/106139350
今日推荐