前言:接上篇,这里继续对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. No application encryption key has been specified.

    环境:php7.1.10laravel5.5出现: 解决:在根目录下执行: php artisan key:generate OK问题解决

  2. mysql的coalesce使用技巧

    今天无意间发现mysql的coalesce, coalesce()解释:返回参数中的第一个非空表达式(从左向右依次类推): 使用示例:a,b,c三个变量. ,); // Return 2 select ...

  3. Heaps(Contest2080 - 湖南多校对抗赛(2015.05.10)(国防科大学校赛决赛-Semilive)+scu1616)

    Problem H: Heaps Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 48  Solved: 9[Submit][Status][Web Bo ...

  4. JS实现异步提交

    什么是XMLHttpRequest? XMLHttpRequest对象用于在后台与服务器交换数据 XMLHttpRequst的作用 在不重新加载页面的情况下更新网页 在页面已加载后从服务器请求数据 在 ...

  5. 用Python实现Zabbix-API 监控

    做运维的朋友应该知道,公司IDC机房经常有上架.下架.报修和报废的服务器.如果服务器数量很多的时候很容易造成监控遗漏.       大的互联网公司把监控系统和CMDB(资产管理系统|配置管理数据库系统 ...

  6. JavaScript碎片—函数闭包(模拟面向对象)

    经过这几天的博客浏览,让我见识大涨,其中有一篇让我感触犹深,JavaScript语言本身是没有面向对象的,但是那些大神们却深深的模拟出来了面向对象,让我震撼不已.本篇博客就是在此基础上加上自己的认知, ...

  7. CSS3布局之box-flex的使用

    语法: box-flex:<number> 其中number取值:使用浮点数指定对象所分配其父元素剩余空间的比例.设置或检索伸缩盒对象的子元素如何分配其剩余空间.(伸缩盒最老版本) htm ...

  8. win7下利用ftp实现华为路由器的配置文件上传和下载

    win7下利用ftp实现华为路由器的配置文件上传和下载 1.  Win7下ftp的安装和配置 (1)开始—>控制面板—>程序—>程序和功能—>打开或关闭Windows功能 (2 ...

  9. java 返回某一天的周日和现在这一周的周日

    import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Calendar;import j ...

  10. 卸载(uninstalled)Mac os Jenkins pkg 安装包

    有些小伙伴不熟悉Jenkins, 在mac上安装,会选择pkg 安装包, 安装后又想卸载,苦于卸载不干净,今天给到一个命令即可搞定. 对应qq群号:616961231打开终端输入下面命令'/Libra ...