首页 > 编程语言 > 详细

秋招之路5:java多线程面试题总结

时间:2020-02-18 23:06:05      阅读:83      评论:0      收藏:0      [点我收藏+]

线程状态图

技术分享图片

Object 对象中的 wait()和notify()是用来实现实现等待 / 通知模式。
其中等待状态和阻塞状态是不同的。
等待状态的线程可以通过notify() 方法唤醒并继续执行,而阻塞状态的线程则是等待获取新的锁。
调用 wait()方法后,当前线程会进入等待状态,直到其他线程调用notify()或notifyAll() 来唤醒。
调用 notify() 方法后,可以唤醒正在等待的单一线程。

并发的三个特性

  1. 原子性: 即一个操作或者多个操作,要么全部执行并且执行过程不被任何因素所打断,要不就都不执行
  2. 有序性: 即程序执行的顺序按照代码的先后顺序执行,不进行指令的重排列。
  3. 可见性: 指多个线程访问同一变量时,一个线程修改了这个变量的值,其他线程能够立即看到修改的值。

synchronized 实现原理?

首先说一下synchronized的作用:保证方法或者代码块在运行时,同一时刻只有一个进程可以进行访问,同时他还可以保证共享变量的内存可见性。
其基本实现代码为:

//对于普通同步方法,锁的是当前实例对象
public class TestSyn{
  private int i=0;
  public synchronized void incr(){
    i++;
  }
}
//对于静态同步方法,锁是Class对象,也就是这一类的对象都进不来
public class TestSyn{
  private int i=0;
  public static synchronized void incr(){
    i++;
  }
}
//对于同步代码块,锁是同步代码块里的对象
public class TestSyn{
  private  int i=0;
  Object o = new Object();
  public  void incr(){
    synchronized(o){
        i++;
    }
  }
}

对于同步代码块:monitorenter 指令插入到同步代码块的开始位置,monitorexit指令插入到同步代码块的结束位置,
JVM需要保证每一个monitorenter都有一个monitorexit与之相对应。任何一个对象都有一个monitor与之相关联[下面三张图可以很好理解,为什么与之相关联]
技术分享图片
技术分享图片
技术分享图片
当一个monitor被持有之后,它将被处于锁的状态。其他线程执行到monitorenter指令时,将尝试获取对象对应的monitor所有权,即尝试获取对象的锁。

秋招之路5:java多线程面试题总结

原文:https://www.cnblogs.com/whyaza/p/12325782.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!