前言:在Java面试中,一定会遇到线程相关问题,因此笔者在这里总结Java中有关线程方面知识点,多数从网上得来(文中会贴出主要参考链接),有些也是笔者在面试中所遇到的问题,如有错误,请不吝指正。主要参考:https://segmentfault.com/a/1190000013813740


1.线程的基本概念

线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位,可以使用多线程对运算进行提速。

参考:

http://www.cnblogs.com/xrq730/p/4850883.html

2.线程安全和不安全

线程安全:在多线程访问数据时,采用了加锁机制。当一个线程访问类中的某个数据时,进行保护,其他线程不能进行访问,直到该线程读取完,其他线程才可使用,不会出现数据不一致或者数据污染。

线程不安全:不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。

线程安全问题都是由全局变量及静态变量引起的。
若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。

3.自旋锁

自旋锁是SMP(Symmetrical Multi-Processing)架构中的一种low-level的同步机制。所谓“自旋”,就是让线程去执行一个无意义的循环,循环结束后再去重新竞争锁,如果竞争不到,则继续循环,循环过程中线程会一直处于running状态,但是基于JVM的线程调度,会出让时间片,所以其他线程依旧有申请锁和释放锁的机会。

自旋锁需要注意:

1)如果线程一直自旋都不能获取锁,会产生很多CPU的性能消耗。

2)持有自旋锁的线程在sleep之前应该释放自旋锁以便其它线程可以获得自旋锁。

参考:

https://zackku.com/java-thread-lock-base/

4.CAS

CAS(compare and swap)的缩写,中文翻译成比较并交换,它是实现并发算法时常用到的一种技术。

CAS 不通过JVM,直接利用java本地方 JNI(Java Native Interface为JAVA本地调用),直接调用CPU 的cmpxchg(是汇编指令)指令。

关于CAS的原理的传送门:Java中的CAS原理

CAS中的ABA问题解决方式:在做CAS操作时对变量增加版本号。参考:

https://www.cnblogs.com/549294286/p/3766717.html

https://blog.csdn.net/ITer_ZC/article/details/40618061

5.乐观锁和悲观锁

悲观锁:悲观锁是指假设并发更新冲突会发生,所以不管冲突是否真的发生,都会使用锁机制。

乐观锁:相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,只在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。

参考:

https://zackku.com/java-thread-lock-base/

6.原子操作

原子操作是指一个不受其他操作影响的操作任务单元(不能被线程调度机制中断的操作)。原子操作是在多线程环境下避免数据不一致的必须手段。

参考:

https://blog.csdn.net/u010796790/article/details/52155664

7.Callable和Future

参考:

https://www.cnblogs.com/fengsehng/p/6048609.html

Callable接口代表一段可以调用并返回结果的代码。

Future接口表示异步任务,是还没有完成的任务给出的未来结果。

所以说Callable用于产生结果,Future用于获取结果。

8.Java中实现线程的方式

在jdk1.5之前有两种方式:1)继承Thread类;2)实现Runnable接口。

从jdk1.5之后又增加了两种方式:1)实现Callable接口通过FutureTask包装器来创建Thread线程;2)使用ExecutorService、Callable、Future实现有返回结果的多线程。

参考:

https://www.cnblogs.com/felixzh/p/6036074.html

9.volatile关键字的作用与原理

共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:

1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。

2)禁止进行指令重排序。

参考:

http://www.cnblogs.com/dolphin0520/p/3920373.html

10.synchronized关键字的用法及优缺点

在Java中,可以使用synchronized关键字来标记一个方法或者代码块,当某个线程调用该对象的synchronized方法或者访问synchronized代码块时,这个线程便获得了该对象的锁,其他线程暂时无法访问这个方法,只有等待这个方法执行完毕或者代码块执行完毕,这个线程才会释放该对象的锁,其他线程才能执行这个方法或者代码块。

关于synchronized的用法,参考:

http://www.cnblogs.com/skywang12345/p/3479202.html

https://blog.csdn.net/fuyuwei2015/article/details/71656266

关于synchronized关键字的其他用法,参考:

http://www.cnblogs.com/dolphin0520/p/3923737.html

https://www.cnblogs.com/fuly550871915/p/4890753.html#top

https://www.cnblogs.com/wchxj/p/8049325.html

11.sleep和wait的区别

参考:http://www.cnblogs.com/DreamSea/archive/2012/01/16/2263844.html

注:线程的执行顺序,不一定是代码的上下文顺序,与线程资源的抢夺有关。

12.ABC三个线程如何保证顺序执行

参考:https://www.cnblogs.com/icejoywoo/archive/2012/10/15/2724674.html

但需注意原博文中,第一种方式是有问题的,因为通过这种方式启动线程,其运行顺序并不一定是代码的上下文顺序。


by Shawn Chen,2018.3.23日,下午。


相关内容

Java面试知识点之线程篇(二)

Java面试知识点之线程篇(三)

Java面试知识点之线程篇(一)的更多相关文章

  1. Java面试知识点之线程篇(三)

    前言:这里继续对java线程相关知识点进行总结,不能间断. 1.yield()方法 yield()的作用是让步.它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执 ...

  2. Java面试知识点之线程篇(二)

    前言:接上篇,这里继续对java线程相关知识点进行总结. 1.notify和notifyall的区别 notify()方法能够唤醒一个正在等待该对象的monitor的线程,当有多个线程都在等待该对象的 ...

  3. Java面试知识点之计算机网络篇(一)

    前言:在Java面试中,计算机网络的知识也是一项重点,因此笔者在此对计算机网络的相关知识进行总结. 1.OSI参考模型 自下而上:物理层(物理介质,比特流).数据链路层(网卡.交换机).网络层(IP协 ...

  4. Java面试知识点之虚拟机篇(一)

    前言:Java虚拟机的重要性不言而喻,不管是在实际工作中,还是面试中. 1.JVM架构 要点: 主要了解Java虚拟机运行时数据区:程序计数器.Java虚拟机栈.本地方法栈.Java堆和方法区. 参考 ...

  5. Java面试知识点之数据库篇(一)

    前言:数据库的相关知识,在面试中也经常出现,笔者认为非常有必要对此类知识进行相关总结. 1.索引 索引是对数据库表中一列或多列的值进行排序的结构,是帮助数据库高效获取数据的数据结构. 通俗理解:索引就 ...

  6. Java 面试知识点解析(二)——高并发编程篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  7. Java 面试知识点解析(三)——JVM篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  8. Java 面试知识点解析(四)——版本特性篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  9. Java 面试知识点解析(六)——数据库篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

随机推荐

  1. vs 调试 iis中的网站

    打开网站,在vs中附加进程,选择w3wp.exe,如果不能下断点,设置一下pdb文件位置

  2. C语言异常处理之 setjmp()和longjmp()

    异常处理之除0情况 相信大家处理除0时,都会通过函数,然后判断除数是否为0,代码如下所示: double divide(doublea,double b) { const double delta = ...

  3. 【Mybatis】MyBatis调用带有返回结果、output参数的存储过程上与ibatis的区别

    用过mybatis的应该都知道它是ibatis被Google收购后重新命名的一个工程,因此也做了大量升级.本文就来介绍下两者在调用存储过程上的一点区别,ibatis有一个专门的标签<proced ...

  4. C#设计模式之十六观察者模式(Observer Pattern)【行为型】

    一.引言 今天是2017年11月份的最后一天,也就是2017年11月30日,利用今天再写一个模式,争取下个月(也就是12月份)把所有的模式写完,2018年,新的一年写一些新的东西.今天我们开始讲“行为 ...

  5. Request method 'POST' not supported错误和解决方法

    在使用SpringBoot的时候,在html页面用form表单post提交数据的时候报错: Request method 'POST' not supported 错误解析: 我是用的前端页面是HTM ...

  6. 一个真实的Async/Await示例

    译者按: 通过真实的代码示例感受Async/Await的力量. 原文: Async/await - A thorough example 译者: Fundebug 为了保证可读性,本文采用意译而非直译 ...

  7. 异常:Data = 由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值。

    做项目的时候,将DataTable序列化成Json,通过ashx向前台返回数据的时候,前台总是获取不到数据,但是程序运行却没问题, 没抛出异常.一时找不到办法,减小输出的数据量,这时前台可以接收到页面 ...

  8. 洛谷P4841 城市规划(生成函数 多项式求逆)

    题意 链接 Sol Orz yyb 一开始想的是直接设\(f_i\)表示\(i\)个点的无向联通图个数,枚举最后一个联通块转移,发现有一种情况转移不到... 正解是先设\(g(n)\)表示\(n\)个 ...

  9. python地理处理包——geopy使用之地理编码与反地理编码

    由于专业需要,经常接触一些地理处理的工具包,文档都是英文的,自己看的同时将其翻译一下,一方面自己学习的同时有个记录,要是能同时给一起的学习的童鞋们一些帮助,想想也是极好的.以下的文档内容主要翻译自官方 ...

  10. 转载------35岁开始转变的观念(干了这碗鸡汤再写代码保证没有bug)

    作为一个标准的IT男,从一开始的一线开发,做到管理层,又因为喜爱开发,跳槽继续专注coding,一干就是10多年.有时候就想,这样一直学习,coding,如果能干到老也挺不错的! 不过生活的压力是不会 ...