前言:在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. c# 判断3个数是否连续最优式子

    Math.Abs((own - two) * (two - there) * + ) ==

  2. ASP.NET MVC 学习笔记-6.异步控制器

    1)         异步控制器的由来 对于IIS,它维护了一个.NET线程池来处理客户端请求,这个线程池称为工作线程池,其中的线程称为工作线程.当IIS接收到一个请求时,需要从工作线程池中唤醒一个工 ...

  3. .NET 单元测试的利剑——模拟框架Moq(简述篇)

    .NET 单元测试的利剑--模拟框架Moq 前言 这篇文章是翻译文,因为通过自己参与的项目,越发觉得单元测试的重要性,特别是当跟业务数据打交道的时候的,Moq就如雪中送炭,所以想学习这个框架,就从这篇 ...

  4. python_字符串的操作

    一:字符串的方法与操作 *注意:首字母为l的为从左边操作,为r的方法为从右边操作 1.__contains__()判断是否包含 判断指定字符或字符串是否包含在一个字符串内,返回值为true或者fals ...

  5. java8 Stream sorted()的一次调用链记录

    代码 public static void main (String[] args) { Stream.of("d2", "a2", "b1" ...

  6. Module的加载实现

    烂笔头开始记录小知识点啦- 浏览器要加载 ES6模块,: <script type="module" src="./foo.js"></scr ...

  7. cron和crontab命令详解 crontab 每分钟、每小时、每天、每周、每月、每年定时执行 crontab每5分钟执行一次

    cron机制        cron可以让系统在指定的时间,去执行某个指定的工作,我们可以使用crontab指令来管理cron机制 crontab参数        -u:这个参数可以让我们去编辑其他 ...

  8. mybatis 中 使用 allowMultiQueries=true

    单条的数据进行修改或者插入的时候没问题,但是进行批量操作的时候就会出现错误,是因为没有开启支持批量操作的功能. mybatis支持批量操作 开启批量执行sql的开关,在拼装mysql链接的url时,为 ...

  9. How To Do Master Record Mass Maintenance

    How To Do Master Record Mass Maintenance Which master records mass maintenance can be done? What do ...

  10. 手动编译websocket-sharp项目使其支持.net core

    以前项目中使用了websocket-sharp,挺好用.可惜,不支持.net core.好在手动编译很顺利: 从github下载源代码 创建dotnet core的类库,复制代码后并编译即可 dotn ...