前言:接上篇,这里继续对java线程相关知识点进行总结。


1.notify和notifyall的区别

notify()方法能够唤醒一个正在等待该对象的monitor的线程,当有多个线程都在等待该对象的monitor的话,则只能唤醒其中一个线程,具体唤醒哪个线程则不得而知。

nofityAll()方法能够唤醒所有正在等待该对象的monitor的线程,也不能决定哪个线程能够获取monitor。

参考:

https://www.iflym.com/index.php/code/201208190001.html

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

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

2.关于ThreadLocal

ThreadLocal使用场合主要解决多线程中数据数据因并发产生不一致问题。ThreadLocal为每个线程的中并发访问的数据提供一个副本,通过访问副本来运行业务,这样的结果是耗费了内存,但大大减少了线程同步所带来性能消耗,也减少了线程并发控制的复杂度。

http://www.cnblogs.com/dolphin0520/p/3920407.html中,作者说“在进行get之前,必须先set,否则会报空指针异常”,其实是因为返回值为null,在进行类型转换的时候报出的异常,并不是在进行get前,必须先set,不进行get操作,也可以运行程序,但是必须将long改为Long包装类

参考:

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

https://www.cnblogs.com/zhangjk1993/archive/2017/03/29/6641745.html

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

http://www.cnblogs.com/swiftma/p/6764821.html

3.线程的几种状态

Thread源码中定义了线程具有以下六种状态:新建状态(NEW)、运行状态(RUNNABLE)、 阻塞状态(BLOCKED)、等待状态(WAITING)、定时等待(TIMED_WAITING)及死亡状态(TERMINATED )。

在我们平时的理解中涉及五种状态:新建状态(New)、就绪状态(Runnable)、运行状态(Running)、阻塞状态(Blocked)和死亡状态(Dead)。

参考:

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

https://blog.csdn.net/pange1991/article/details/53860651

https://www.cnblogs.com/GooPolaris/p/8079490.html

4.关于线程池及其创建过程

线程池:帮我们重复管理线程,避免创建大量的线程增加开销。具体相关知识,请参见下面的参考链接。

参考:

https://blog.csdn.net/u011240877/article/details/73440993

https://www.cnblogs.com/waytobestcoder/p/5323130.html

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

http://www.crazyant.net/2124.html

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

5.关于Lock接口

关于Lock可以和synchronized进行一个对比:

1)Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现;

2)synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;

3)Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;

4)通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。

5)Lock可以提高多个线程进行读操作的效率。

参考:

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

6.死锁

当多个线程相互等待已经被对方占用的资源时,就会产生死锁。

如何避免死锁:

1)不要在一条线程中嵌套使用多个锁。

2)不要在一条线程中嵌套占用多个计算机资源。

3)给锁和资源加超时时间:如果非要在一条线程中嵌套使用多个锁或占用多个资源,需要给锁、资源加超时时间,从而避免无限期的等待。

参考:

https://blog.csdn.net/u010425776/article/details/54233279

搜云库

7.重排序

重排序指的是编译器、处理器在不改变程序执行结果的前提下,重新排列指令的执行顺序,以达到最佳的运行效率。

参考:

https://www.cnblogs.com/xll1025/p/6486170.html

8.线程间通信

下面的参考链接给出了几种线程间的通信方式,注意理解。

参考:

https://blog.csdn.net/u010425776/article/details/54341405

http://www.importnew.com/26850.html。注:文中的前两种方式会造成死锁,解决方式加sleep。

https://blog.csdn.net/u011514810/article/details/77131296

9.关于单例模式

单例模式在面试中,出现的概率极高,因为它的实现代码相对较少,因此需要特别注意,推荐使用枚举机制来实现单例模式。

参考:

https://www.jianshu.com/p/fc7fc57d4360

https://blog.csdn.net/gavin_dyson/article/details/70832185

10.如何保证多线程下 i++ 结果的正确性

如果使用volatile进行变量的修饰,是不能得到预期的结果的,因为volatile只能保证数据的可见性(获取到的是最新的数据,不能保证原子性,即volatile跟原子性没关系),要保证原子性对数据的累加,可以用AtomicInteger类,也可以用synchronized来保证数据的一致性。

参考:

搜云库

11.阻塞式方法

阻塞式方法是指程序会一直等待该方法完成,期间不做其他事情,ServerSocket的accept()方法就是一直等待客户端连接。这里的阻塞是指调用结果返回之前,当前线程会被挂起,直到得到结果之后才会返回。此外,异步和非阻塞式方法在任务完成前就返回。

12.Thread类中start()方法和run()方法的区别

只有调用了start()方法,才会表现出多线程的特性,不同线程的run()方法里面的代码交替执行。如果只是调用run()方法,那么代码还是同步执行的,必须等待一个线程的run()方法里面的代码全部执行完毕之后,另外一个线程才可以执行其run()方法里面的代码,也就说是顺序执行,具有确定性。

参考:

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


by Shawn Chen,2018.3.27日,下午。


相关内容

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

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

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

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

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

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

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

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

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

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

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

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

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

  6. Java面试知识点汇总

    Java面试知识点汇总 置顶 2019年05月07日 15:36:18 温柔的谢世杰 阅读数 21623 文章标签: 面经java 更多 分类专栏: java 面试 Java面试知识汇总   版权声明 ...

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

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

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

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

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

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

随机推荐

  1. Tomcat 8005/8009/8080/8443端口的作用

    --关闭tomcat进程所用.当执行shutdown.sh关闭tomcat时就是连接8005端口执行“SHUTDOWN”命令--由此,我们直接telnet8005端口执行“SHUTDOWN”(要大写, ...

  2. springMVC常见错误-解决org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.spring

    笔者参考文档: https://blog.csdn.net/sinat_24928447/article/details/47807105 可能错误原因即解决方法: 1.配置文件错误 a)这是配置文件 ...

  3. 慕课网maven多环境配置

    profile 下面的节点,是把profile 标签内容复制几份,并且需要把<activation> 去掉.在idea右侧 maven button 中会出现选择 节点. 接着打包命令和打 ...

  4. 【Java每日一题】20170207

    20170206问题解析请点击今日问题下方的“[Java每日一题]20170207”查看(问题解析在公众号首发,公众号ID:weknow619) package Feb2017; public cla ...

  5. 如何清除浮动(float)所带来的影响

    清除浮动(float) 1.定义和用法 在w3c中给了浮动这样的定义. "float 属性定义元素在哪个方向浮动.以往这个属性总应用于图像,使文本围绕在图像周围,不过在 CSS 中,任何元素 ...

  6. Exception 和 Error 有什么区别么

    声明 本篇所涉及的提问,正文的知识点,全都来自于杨晓峰的<Java核心技术36讲>,当然,我并不会全文照搬过来,毕竟这是付费的课程,应该会涉及到侵权之类的问题. 所以,本篇正文中的知识点, ...

  7. [转]JS学习总结-技巧、方法、细节

    变量转换 var myVar = "3.14159", str = ""+ myVar,// string类型 int = ~~myVar, // number ...

  8. python里文件读写操作

    文件读写操作一种基本操作,但是里面也存在很多需要注意的问题,例如字符编码.内存缓冲.指针位置等等.如果忽视这些问题就会引起很多不必要的麻烦.简单来说,文件的读写分为几个过程: 打开文件,并定义操作文件 ...

  9. Python 多线程并发程序设计与分析

    多线程并发程序设计与分析 by:授客 QQ:1033553122 1.技术难点分析与总结 难点1:线程运行时,运行顺序不固定 难点2:同一段代码,再不加锁的情况下,可能被多个线程同时执行,这会造成很多 ...

  10. DAY14(PYTHONS)生成器进阶

    def average(): sum = 0 count = 0 avg = 0 while True: #循环 num = yield avg #遇到yield就停止,防止一开始除数为0导致崩溃 s ...